±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;