mirror of
https://github.com/denoland/deno.git
synced 2025-09-26 20:29:11 +00:00
fix(unstable/temporal): implement Temporal.ZonedDateTime.getTimeZoneTransition
(#27770)
This patches Temporal to support the `getTimeZoneTransition` method on `ZonedDateTime`. See https://github.com/denoland/deno/issues/27731. Co-authored-by: printfn <printfn@users.noreply.github.com>
This commit is contained in:
parent
36933fb0b8
commit
70d775c57d
4 changed files with 155 additions and 204 deletions
|
@ -42,6 +42,7 @@ const {
|
||||||
ObjectSetPrototypeOf,
|
ObjectSetPrototypeOf,
|
||||||
PromisePrototypeThen,
|
PromisePrototypeThen,
|
||||||
PromiseResolve,
|
PromiseResolve,
|
||||||
|
RangeError,
|
||||||
StringPrototypePadEnd,
|
StringPrototypePadEnd,
|
||||||
Symbol,
|
Symbol,
|
||||||
SymbolIterator,
|
SymbolIterator,
|
||||||
|
@ -473,6 +474,136 @@ function exposeUnstableFeaturesForWindowOrWorkerGlobalScope(unstableFeatures) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateTemporal() {
|
||||||
|
// Removes the obsoleted `Temporal` API.
|
||||||
|
// https://github.com/tc39/proposal-temporal/pull/2895
|
||||||
|
// https://github.com/tc39/proposal-temporal/pull/2914
|
||||||
|
// https://github.com/tc39/proposal-temporal/pull/2925
|
||||||
|
if (typeof globalThis.Temporal.Instant.fromEpochSeconds === "undefined") {
|
||||||
|
throw "V8 removes obsoleted Temporal API now, no need to delete them";
|
||||||
|
}
|
||||||
|
delete globalThis.Temporal.Instant.fromEpochSeconds;
|
||||||
|
delete globalThis.Temporal.Instant.fromEpochMicroseconds;
|
||||||
|
delete globalThis.Temporal.Instant.prototype.epochSeconds;
|
||||||
|
delete globalThis.Temporal.Instant.prototype.epochMicroseconds;
|
||||||
|
delete globalThis.Temporal.Instant.prototype.toZonedDateTime;
|
||||||
|
delete globalThis.Temporal.PlainDate.prototype.getISOFiels; // weird
|
||||||
|
delete globalThis.Temporal.PlainDate.prototype.getISOFields;
|
||||||
|
delete globalThis.Temporal.PlainDateTime.prototype.withPlainDate;
|
||||||
|
delete globalThis.Temporal.PlainDateTime.prototype.toPlainYearMonth;
|
||||||
|
delete globalThis.Temporal.PlainDateTime.prototype.toPlainMonthDay;
|
||||||
|
delete globalThis.Temporal.PlainDateTime.prototype.getISOFields;
|
||||||
|
delete globalThis.Temporal.PlainMonthDay.prototype.getISOFields;
|
||||||
|
delete globalThis.Temporal.PlainTime.prototype.calendar;
|
||||||
|
delete globalThis.Temporal.PlainTime.prototype.toPlainDateTime;
|
||||||
|
delete globalThis.Temporal.PlainTime.prototype.toZonedDateTime;
|
||||||
|
delete globalThis.Temporal.PlainTime.prototype.getISOFields;
|
||||||
|
delete globalThis.Temporal.PlainYearMonth.prototype.getISOFields;
|
||||||
|
delete globalThis.Temporal.ZonedDateTime.prototype.epochSeconds;
|
||||||
|
delete globalThis.Temporal.ZonedDateTime.prototype.epochMicroseconds;
|
||||||
|
delete globalThis.Temporal.ZonedDateTime.prototype.withPlainDate;
|
||||||
|
delete globalThis.Temporal.ZonedDateTime.prototype.toPlainYearMonth;
|
||||||
|
delete globalThis.Temporal.ZonedDateTime.prototype.toPlainMonthDay;
|
||||||
|
delete globalThis.Temporal.ZonedDateTime.prototype.getISOFields;
|
||||||
|
delete globalThis.Temporal.Now.zonedDateTime;
|
||||||
|
delete globalThis.Temporal.Now.plainDateTime;
|
||||||
|
delete globalThis.Temporal.Now.plainDate;
|
||||||
|
delete globalThis.Temporal.Calendar;
|
||||||
|
delete globalThis.Temporal.TimeZone;
|
||||||
|
|
||||||
|
// Modify `Temporal.Calendar` to calendarId string
|
||||||
|
ArrayPrototypeForEach([
|
||||||
|
globalThis.Temporal.PlainDate,
|
||||||
|
globalThis.Temporal.PlainDateTime,
|
||||||
|
globalThis.Temporal.PlainMonthDay,
|
||||||
|
globalThis.Temporal.PlainYearMonth,
|
||||||
|
globalThis.Temporal.ZonedDateTime,
|
||||||
|
], (target) => {
|
||||||
|
const getCalendar =
|
||||||
|
ObjectGetOwnPropertyDescriptor(target.prototype, "calendar").get;
|
||||||
|
ObjectDefineProperty(target.prototype, "calendarId", {
|
||||||
|
__proto__: null,
|
||||||
|
get: function calendarId() {
|
||||||
|
return FunctionPrototypeCall(getCalendar, this).id;
|
||||||
|
},
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true,
|
||||||
|
});
|
||||||
|
delete target.prototype.calendar;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Modify `Temporal.TimeZone` to timeZoneId string
|
||||||
|
{
|
||||||
|
const getTimeZone = ObjectGetOwnPropertyDescriptor(
|
||||||
|
globalThis.Temporal.ZonedDateTime.prototype,
|
||||||
|
"timeZone",
|
||||||
|
).get;
|
||||||
|
ObjectDefineProperty(
|
||||||
|
globalThis.Temporal.ZonedDateTime.prototype,
|
||||||
|
"timeZoneId",
|
||||||
|
{
|
||||||
|
__proto__: null,
|
||||||
|
get: function timeZoneId() {
|
||||||
|
return FunctionPrototypeCall(getTimeZone, this).id;
|
||||||
|
},
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
ObjectAssign(globalThis.Temporal.ZonedDateTime.prototype, {
|
||||||
|
getTimeZoneTransition(options) {
|
||||||
|
if (options === undefined) {
|
||||||
|
throw new TypeError("options parameter is required");
|
||||||
|
}
|
||||||
|
if (typeof options === "string") {
|
||||||
|
options = {
|
||||||
|
direction: options,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const direction = options.direction;
|
||||||
|
if (direction === undefined) {
|
||||||
|
throw new TypeError("direction option is required");
|
||||||
|
}
|
||||||
|
const tz = FunctionPrototypeCall(getTimeZone, this);
|
||||||
|
let resultInstant;
|
||||||
|
switch (direction) {
|
||||||
|
case "next":
|
||||||
|
resultInstant = tz.getNextTransition(this.toInstant());
|
||||||
|
break;
|
||||||
|
case "previous":
|
||||||
|
resultInstant = tz.getPreviousTransition(this.toInstant());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new RangeError(
|
||||||
|
`direction must be one of next, previous, not ${options.direction}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return resultInstant?.toZonedDateTimeISO(tz.id) ?? null;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
delete globalThis.Temporal.ZonedDateTime.prototype.timeZone;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const nowTimeZone = globalThis.Temporal.Now.timeZone;
|
||||||
|
ObjectDefineProperty(globalThis.Temporal.Now, "timeZoneId", {
|
||||||
|
__proto__: null,
|
||||||
|
value: function timeZoneId() {
|
||||||
|
return nowTimeZone().id;
|
||||||
|
},
|
||||||
|
writable: true,
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true,
|
||||||
|
});
|
||||||
|
delete globalThis.Temporal.Now.timeZone;
|
||||||
|
}
|
||||||
|
|
||||||
|
// deno-lint-ignore prefer-primordials
|
||||||
|
if (new Temporal.Duration().toLocaleString("en-US") !== "PT0S") {
|
||||||
|
throw "V8 supports Temporal.Duration.prototype.toLocaleString now, no need to shim it";
|
||||||
|
}
|
||||||
|
shimTemporalDurationToLocaleString();
|
||||||
|
}
|
||||||
|
|
||||||
function shimTemporalDurationToLocaleString() {
|
function shimTemporalDurationToLocaleString() {
|
||||||
const DurationFormat = Intl.DurationFormat;
|
const DurationFormat = Intl.DurationFormat;
|
||||||
if (!DurationFormat) {
|
if (!DurationFormat) {
|
||||||
|
@ -803,102 +934,7 @@ function bootstrapMainRuntime(runtimeOptions, warmup = false) {
|
||||||
delete globalThis.Temporal;
|
delete globalThis.Temporal;
|
||||||
delete globalThis.Date.prototype.toTemporalInstant;
|
delete globalThis.Date.prototype.toTemporalInstant;
|
||||||
} else {
|
} else {
|
||||||
// Removes the obsoleted `Temporal` API.
|
updateTemporal();
|
||||||
// https://github.com/tc39/proposal-temporal/pull/2895
|
|
||||||
// https://github.com/tc39/proposal-temporal/pull/2914
|
|
||||||
// https://github.com/tc39/proposal-temporal/pull/2925
|
|
||||||
if (typeof globalThis.Temporal.Instant.fromEpochSeconds === "undefined") {
|
|
||||||
throw "V8 removes obsoleted Temporal API now, no need to delete them";
|
|
||||||
}
|
|
||||||
delete globalThis.Temporal.Instant.fromEpochSeconds;
|
|
||||||
delete globalThis.Temporal.Instant.fromEpochMicroseconds;
|
|
||||||
delete globalThis.Temporal.Instant.prototype.epochSeconds;
|
|
||||||
delete globalThis.Temporal.Instant.prototype.epochMicroseconds;
|
|
||||||
delete globalThis.Temporal.Instant.prototype.toZonedDateTime;
|
|
||||||
delete globalThis.Temporal.PlainDate.prototype.getISOFiels; // weird
|
|
||||||
delete globalThis.Temporal.PlainDate.prototype.getISOFields;
|
|
||||||
delete globalThis.Temporal.PlainDateTime.prototype.withPlainDate;
|
|
||||||
delete globalThis.Temporal.PlainDateTime.prototype.toPlainYearMonth;
|
|
||||||
delete globalThis.Temporal.PlainDateTime.prototype.toPlainMonthDay;
|
|
||||||
delete globalThis.Temporal.PlainDateTime.prototype.getISOFields;
|
|
||||||
delete globalThis.Temporal.PlainMonthDay.prototype.getISOFields;
|
|
||||||
delete globalThis.Temporal.PlainTime.prototype.calendar;
|
|
||||||
delete globalThis.Temporal.PlainTime.prototype.toPlainDateTime;
|
|
||||||
delete globalThis.Temporal.PlainTime.prototype.toZonedDateTime;
|
|
||||||
delete globalThis.Temporal.PlainTime.prototype.getISOFields;
|
|
||||||
delete globalThis.Temporal.PlainYearMonth.prototype.getISOFields;
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.epochSeconds;
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.epochMicroseconds;
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.withPlainDate;
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.toPlainYearMonth;
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.toPlainMonthDay;
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.getISOFields;
|
|
||||||
delete globalThis.Temporal.Now.zonedDateTime;
|
|
||||||
delete globalThis.Temporal.Now.plainDateTime;
|
|
||||||
delete globalThis.Temporal.Now.plainDate;
|
|
||||||
delete globalThis.Temporal.Calendar;
|
|
||||||
delete globalThis.Temporal.TimeZone;
|
|
||||||
|
|
||||||
// Modify `Temporal.Calendar` to calendarId string
|
|
||||||
ArrayPrototypeForEach([
|
|
||||||
globalThis.Temporal.PlainDate,
|
|
||||||
globalThis.Temporal.PlainDateTime,
|
|
||||||
globalThis.Temporal.PlainMonthDay,
|
|
||||||
globalThis.Temporal.PlainYearMonth,
|
|
||||||
globalThis.Temporal.ZonedDateTime,
|
|
||||||
], (target) => {
|
|
||||||
const getCalendar =
|
|
||||||
ObjectGetOwnPropertyDescriptor(target.prototype, "calendar").get;
|
|
||||||
ObjectDefineProperty(target.prototype, "calendarId", {
|
|
||||||
__proto__: null,
|
|
||||||
get: function calendarId() {
|
|
||||||
return FunctionPrototypeCall(getCalendar, this).id;
|
|
||||||
},
|
|
||||||
enumerable: false,
|
|
||||||
configurable: true,
|
|
||||||
});
|
|
||||||
delete target.prototype.calendar;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Modify `Temporal.TimeZone` to timeZoneId string
|
|
||||||
{
|
|
||||||
const getTimeZone = ObjectGetOwnPropertyDescriptor(
|
|
||||||
globalThis.Temporal.ZonedDateTime.prototype,
|
|
||||||
"timeZone",
|
|
||||||
).get;
|
|
||||||
ObjectDefineProperty(
|
|
||||||
globalThis.Temporal.ZonedDateTime.prototype,
|
|
||||||
"timeZoneId",
|
|
||||||
{
|
|
||||||
__proto__: null,
|
|
||||||
get: function timeZoneId() {
|
|
||||||
return FunctionPrototypeCall(getTimeZone, this).id;
|
|
||||||
},
|
|
||||||
enumerable: false,
|
|
||||||
configurable: true,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.timeZone;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
const nowTimeZone = globalThis.Temporal.Now.timeZone;
|
|
||||||
ObjectDefineProperty(globalThis.Temporal.Now, "timeZoneId", {
|
|
||||||
__proto__: null,
|
|
||||||
value: function timeZoneId() {
|
|
||||||
return nowTimeZone().id;
|
|
||||||
},
|
|
||||||
writable: true,
|
|
||||||
enumerable: false,
|
|
||||||
configurable: true,
|
|
||||||
});
|
|
||||||
delete globalThis.Temporal.Now.timeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
// deno-lint-ignore prefer-primordials
|
|
||||||
if (new Temporal.Duration().toLocaleString("en-US") !== "PT0S") {
|
|
||||||
throw "V8 supports Temporal.Duration.prototype.toLocaleString now, no need to shim it";
|
|
||||||
}
|
|
||||||
shimTemporalDurationToLocaleString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup `Deno` global - we're actually overriding already existing global
|
// Setup `Deno` global - we're actually overriding already existing global
|
||||||
|
@ -1014,98 +1050,7 @@ function bootstrapWorkerRuntime(
|
||||||
delete globalThis.Temporal;
|
delete globalThis.Temporal;
|
||||||
delete globalThis.Date.prototype.toTemporalInstant;
|
delete globalThis.Date.prototype.toTemporalInstant;
|
||||||
} else {
|
} else {
|
||||||
// Removes the obsoleted `Temporal` API.
|
updateTemporal();
|
||||||
// https://github.com/tc39/proposal-temporal/pull/2895
|
|
||||||
// https://github.com/tc39/proposal-temporal/pull/2914
|
|
||||||
// https://github.com/tc39/proposal-temporal/pull/2925
|
|
||||||
if (typeof globalThis.Temporal.Instant.fromEpochSeconds === "undefined") {
|
|
||||||
throw "V8 removes obsoleted Temporal API now, no need to delete them";
|
|
||||||
}
|
|
||||||
delete globalThis.Temporal.Instant.fromEpochSeconds;
|
|
||||||
delete globalThis.Temporal.Instant.fromEpochMicroseconds;
|
|
||||||
delete globalThis.Temporal.Instant.prototype.epochSeconds;
|
|
||||||
delete globalThis.Temporal.Instant.prototype.epochMicroseconds;
|
|
||||||
delete globalThis.Temporal.Instant.prototype.toZonedDateTime;
|
|
||||||
delete globalThis.Temporal.PlainDate.prototype.getISOFiels; // weird
|
|
||||||
delete globalThis.Temporal.PlainDate.prototype.getISOFields;
|
|
||||||
delete globalThis.Temporal.PlainDateTime.prototype.withPlainDate;
|
|
||||||
delete globalThis.Temporal.PlainDateTime.prototype.toPlainYearMonth;
|
|
||||||
delete globalThis.Temporal.PlainDateTime.prototype.toPlainMonthDay;
|
|
||||||
delete globalThis.Temporal.PlainDateTime.prototype.getISOFields;
|
|
||||||
delete globalThis.Temporal.PlainMonthDay.prototype.getISOFields;
|
|
||||||
delete globalThis.Temporal.PlainTime.prototype.calendar;
|
|
||||||
delete globalThis.Temporal.PlainTime.prototype.toPlainDateTime;
|
|
||||||
delete globalThis.Temporal.PlainTime.prototype.toZonedDateTime;
|
|
||||||
delete globalThis.Temporal.PlainTime.prototype.getISOFields;
|
|
||||||
delete globalThis.Temporal.PlainYearMonth.prototype.getISOFields;
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.epochSeconds;
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.epochMicroseconds;
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.withPlainDate;
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.toPlainYearMonth;
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.toPlainMonthDay;
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.getISOFields;
|
|
||||||
delete globalThis.Temporal.Now.zonedDateTime;
|
|
||||||
delete globalThis.Temporal.Now.plainDateTime;
|
|
||||||
delete globalThis.Temporal.Now.plainDate;
|
|
||||||
delete globalThis.Temporal.Calendar;
|
|
||||||
delete globalThis.Temporal.TimeZone;
|
|
||||||
|
|
||||||
// Modify `Temporal.Calendar` to calendarId string
|
|
||||||
ArrayPrototypeForEach([
|
|
||||||
globalThis.Temporal.PlainDate,
|
|
||||||
globalThis.Temporal.PlainDateTime,
|
|
||||||
globalThis.Temporal.PlainMonthDay,
|
|
||||||
globalThis.Temporal.PlainYearMonth,
|
|
||||||
globalThis.Temporal.ZonedDateTime,
|
|
||||||
], (target) => {
|
|
||||||
const getCalendar =
|
|
||||||
ObjectGetOwnPropertyDescriptor(target.prototype, "calendar").get;
|
|
||||||
ObjectDefineProperty(target.prototype, "calendarId", {
|
|
||||||
__proto__: null,
|
|
||||||
get: function calendarId() {
|
|
||||||
return FunctionPrototypeCall(getCalendar, this).id;
|
|
||||||
},
|
|
||||||
enumerable: false,
|
|
||||||
configurable: true,
|
|
||||||
});
|
|
||||||
delete target.prototype.calendar;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Modify `Temporal.TimeZone` to timeZoneId string
|
|
||||||
{
|
|
||||||
const getTimeZone = ObjectGetOwnPropertyDescriptor(
|
|
||||||
globalThis.Temporal.ZonedDateTime.prototype,
|
|
||||||
"timeZone",
|
|
||||||
).get;
|
|
||||||
ObjectDefineProperty(
|
|
||||||
globalThis.Temporal.ZonedDateTime.prototype,
|
|
||||||
"timeZoneId",
|
|
||||||
{
|
|
||||||
__proto__: null,
|
|
||||||
get: function timeZoneId() {
|
|
||||||
return FunctionPrototypeCall(getTimeZone, this).id;
|
|
||||||
},
|
|
||||||
enumerable: false,
|
|
||||||
configurable: true,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
delete globalThis.Temporal.ZonedDateTime.prototype.timeZone;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
const nowTimeZone = globalThis.Temporal.Now.timeZone;
|
|
||||||
ObjectDefineProperty(globalThis.Temporal.Now, "timeZoneId", {
|
|
||||||
__proto__: null,
|
|
||||||
value: function timeZoneId() {
|
|
||||||
return nowTimeZone().id;
|
|
||||||
},
|
|
||||||
writable: true,
|
|
||||||
enumerable: false,
|
|
||||||
configurable: true,
|
|
||||||
});
|
|
||||||
delete globalThis.Temporal.Now.timeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
shimTemporalDurationToLocaleString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup `Deno` global - we're actually overriding already existing global
|
// Setup `Deno` global - we're actually overriding already existing global
|
||||||
|
|
|
@ -39,22 +39,22 @@ Temporal.Instant.prototype
|
||||||
]
|
]
|
||||||
Temporal.ZonedDateTime.prototype
|
Temporal.ZonedDateTime.prototype
|
||||||
[
|
[
|
||||||
"add", "calendarId", "constructor",
|
"add", "calendarId", "constructor",
|
||||||
"day", "dayOfWeek", "dayOfYear",
|
"day", "dayOfWeek", "dayOfYear",
|
||||||
"daysInMonth", "daysInWeek", "daysInYear",
|
"daysInMonth", "daysInWeek", "daysInYear",
|
||||||
"epochMilliseconds", "epochNanoseconds", "equals",
|
"epochMilliseconds", "epochNanoseconds", "equals",
|
||||||
"era", "eraYear", "hour",
|
"era", "eraYear", "getTimeZoneTransition",
|
||||||
"hoursInDay", "inLeapYear", "microsecond",
|
"hour", "hoursInDay", "inLeapYear",
|
||||||
"millisecond", "minute", "month",
|
"microsecond", "millisecond", "minute",
|
||||||
"monthCode", "monthsInYear", "nanosecond",
|
"month", "monthCode", "monthsInYear",
|
||||||
"offset", "offsetNanoseconds", "round",
|
"nanosecond", "offset", "offsetNanoseconds",
|
||||||
"second", "since", "startOfDay",
|
"round", "second", "since",
|
||||||
"subtract", "timeZoneId", "toInstant",
|
"startOfDay", "subtract", "timeZoneId",
|
||||||
"toJSON", "toLocaleString", "toPlainDate",
|
"toInstant", "toJSON", "toLocaleString",
|
||||||
"toPlainDateTime", "toPlainTime", "toString",
|
"toPlainDate", "toPlainDateTime", "toPlainTime",
|
||||||
"until", "valueOf", "weekOfYear",
|
"toString", "until", "valueOf",
|
||||||
"with", "withCalendar", "withPlainTime",
|
"weekOfYear", "with", "withCalendar",
|
||||||
"withTimeZone", "year"
|
"withPlainTime", "withTimeZone", "year"
|
||||||
]
|
]
|
||||||
Temporal.PlainDate.prototype
|
Temporal.PlainDate.prototype
|
||||||
[
|
[
|
||||||
|
|
|
@ -6,3 +6,4 @@ UTC
|
||||||
undefined
|
undefined
|
||||||
undefined
|
undefined
|
||||||
1 day, 6 hr, 30 min
|
1 day, 6 hr, 30 min
|
||||||
|
2020-03-08T03:00:00-04:00[America/New_York]
|
||||||
|
|
|
@ -12,3 +12,8 @@ console.log(zoned.timeZone);
|
||||||
|
|
||||||
const duration = Temporal.Duration.from("P1DT6H30M");
|
const duration = Temporal.Duration.from("P1DT6H30M");
|
||||||
console.log(duration.toLocaleString("en-US"));
|
console.log(duration.toLocaleString("en-US"));
|
||||||
|
|
||||||
|
const transition = Temporal.ZonedDateTime.from(
|
||||||
|
"2020-01-01T00:00:00-05:00[America/New_York]",
|
||||||
|
).getTimeZoneTransition("next");
|
||||||
|
console.log(transition);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue