±PnYnMnWnDTnHnMnS
P7D
is 7 days.
P1M
is 1 month.
PT10M
is 10 minutes.
P1DT12H
is 1 day plus 12 hours.
Temporal.ZonedDateTime.from( "2025-03-08T12:00:00-05:00[America/Detroit]" ).toString() - "2025-03-08T12:00:00-05:00[America/Detroit]" - ^^ ^^ ^^ Temporal.ZonedDateTime.from( "2025-03-08T12:00:00-05:00[America/Detroit]" ) .add( Temporal.Duration.from( "P1D" ) ) .toString() - "2025-03-09T12:00:00-04:00[America/Detroit]" - ^^ ^^ ^^ Temporal.ZonedDateTime.from( "2025-03-08T12:00:00-05:00[America/Detroit]" ) .add( Temporal.Duration.from( "PT24H" ) ) .toString() - "2025-03-09T13:00:00-04:00[America/Detroit]" - ^^ ^^ ^^ Temporal.ZonedDateTime.from( "2025-03-08T12:00:00-05:00[America/Detroit]" ) .add( Temporal.Duration.from( "P1DT24H" ) ) .toString() - "2025-03-10T12:00:00-04:00[America/Detroit]" - ^^ ^^ ^^ // the paradox, `x + a - a != x` Temporal.ZonedDateTime.from( "2025-03-08T12:00:00-05:00[America/Detroit]" ) .add ( Temporal.Duration.from( "P1DT24H" ) ) .subtract ( Temporal.Duration.from( "P1DT24H" ) ) .toString() - "2025-03-08T11:00:00-05:00[America/Detroit]" - ^^ ^^ Temporal.ZonedDateTime.from( "2025-03-08T12:00:00-05:00[America/Detroit]" ) .add ( Temporal.Duration.from( "P1D" ) ) .add ( Temporal.Duration.from( "PT24H" ) ) .subtract ( Temporal.Duration.from( "P1D" ) ) .subtract ( Temporal.Duration.from( "PT24H" ) ) .toString() - "2025-03-08T11:00:00-05:00[America/Detroit]" - ^^ ^^ Temporal.ZonedDateTime.from( "2025-03-08T12:00:00-05:00[America/Detroit]" ) .add ( Temporal.Duration.from( "P1D" ) ) .add ( Temporal.Duration.from( "PT24H" ) ) .subtract ( Temporal.Duration.from( "PT24H" ) ) .subtract ( Temporal.Duration.from( "P1D" ) ) .toString() - "2025-03-08T12:00:00-05:00[America/Detroit]" - ^^ ^^ .. // demonstration of "spring forward" Temporal.ZonedDateTime.from( "2025-03-09T07:00:00Z[America/Detroit]" ).toString() - "2025-03-09T03:00:00-04:00[America/Detroit]" - ^^^^^^^^^^^^^^ Temporal.ZonedDateTime.from( "2025-03-09T06:59:59Z[America/Detroit]" ).toString() - "2025-03-09T01:59:59-05:00[America/Detroit]" - ^^^^^^^^^^^^^^ Temporal.ZonedDateTime.from( "2025-03-09T06:59:59Z[America/Detroit]" ) .add( Temporal.Duration.from( "PT1S" ) ) .toString() - "2025-03-09T03:00:00-04:00[America/Detroit]" - ^^^^^^^^^^^^^^ .. explanation: hours are a fixed unit, but "days" vary; a day in north america can range from 23 to 25 hours, specifically when daylight savings changes. so adding a "day" depends on the reference of which day. the `.add()` call calculates the day as 23 hours because March 9th is when "daylight savings time" changes. the `.subtract()` call calculates the day as 24 hours because it's reference is March 10th, not March 9th.
yyyy-mm-ddThh:mm:ss
1970-00-00T00:00:00Z
1970-00-00T00:00:00+00:00
Temporal.Duration.from( "PT50M" ).round( { smallestUnit: "hour" } ).total( { unit: "hour" } )
Temporal.Duration.from( "P5D" ).round( { smallestUnit: "hour" } ).total( { unit: "hour" } )
zdt.add( duration )
Temporal.Now.zonedDateTimeISO()
zdt.since( zdt )
zdt.until( zdt )
dur.round( { smallestUnit: "hour" } )
dur.total( { unit: "hour" } )
const Temporal = window.Temporal ?? ( await import( "https://unpkg.com/@js-temporal/polyfill@0.4.4/dist/index.esm.js?module" ) ).Temporal;
var durStr = "P1Y2WT2H1M1S"; // TODO user input var end = Temporal.Now.zonedDateTimeISO() .add( Temporal.Duration.from( durStr ) ) // .subtract( Temporal.Duration.from( "PT2H" ) ); ; var intervalId = setInterval( function() { // XXX var dur = begin.until( Temporal.Now.zonedDateTimeISO() ); var dur = Temporal.Now.zonedDateTimeISO().until( end ); // seconds may be fractional var rnd = dur.round( { smallestUnit: "second" } ); console.log( rnd.toString(), rnd.toLocaleString( "en-US", { style: "narrow" } ) ); // +search iso8601 duration basic extended format }, 1000 );
clearInterval( intervalId ); intervalId = null;