1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 00:07:36 +00:00

LibJS: Handle ZonedDateTime in ToTemporalDate

This commit is contained in:
Linus Groh 2021-08-01 17:59:20 +01:00
parent 6f75dcc7b8
commit 4640643019
2 changed files with 34 additions and 4 deletions

View file

@ -8,10 +8,13 @@
#include <LibJS/Runtime/AbstractOperations.h> #include <LibJS/Runtime/AbstractOperations.h>
#include <LibJS/Runtime/GlobalObject.h> #include <LibJS/Runtime/GlobalObject.h>
#include <LibJS/Runtime/Temporal/Calendar.h> #include <LibJS/Runtime/Temporal/Calendar.h>
#include <LibJS/Runtime/Temporal/Instant.h>
#include <LibJS/Runtime/Temporal/PlainDate.h> #include <LibJS/Runtime/Temporal/PlainDate.h>
#include <LibJS/Runtime/Temporal/PlainDateConstructor.h> #include <LibJS/Runtime/Temporal/PlainDateConstructor.h>
#include <LibJS/Runtime/Temporal/PlainDateTime.h> #include <LibJS/Runtime/Temporal/PlainDateTime.h>
#include <LibJS/Runtime/Temporal/PlainYearMonth.h> #include <LibJS/Runtime/Temporal/PlainYearMonth.h>
#include <LibJS/Runtime/Temporal/TimeZone.h>
#include <LibJS/Runtime/Temporal/ZonedDateTime.h>
namespace JS::Temporal { namespace JS::Temporal {
@ -89,10 +92,20 @@ PlainDate* to_temporal_date(GlobalObject& global_object, Value item, Object* opt
} }
// b. If item has an [[InitializedTemporalZonedDateTime]] internal slot, then // b. If item has an [[InitializedTemporalZonedDateTime]] internal slot, then
// i. Let instant be ! CreateTemporalInstant(item.[[Nanoseconds]]). if (is<ZonedDateTime>(item_object)) {
// ii. Let plainDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(item.[[TimeZone]], instant, item.[[Calendar]]). auto& zoned_date_time = static_cast<ZonedDateTime&>(item_object);
// iii. Return ! CreateTemporalDate(plainDateTime.[[ISOYear]], plainDateTime.[[ISOMonth]], plainDateTime.[[ISODay]], plainDateTime.[[Calendar]]).
// TODO // i. Let instant be ! CreateTemporalInstant(item.[[Nanoseconds]]).
auto* instant = create_temporal_instant(global_object, zoned_date_time.nanoseconds());
// ii. Let plainDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(item.[[TimeZone]], instant, item.[[Calendar]]).
auto* plain_date_time = builtin_time_zone_get_plain_date_time_for(global_object, &zoned_date_time.time_zone(), *instant, zoned_date_time.calendar());
if (vm.exception())
return {};
// iii. Return ! CreateTemporalDate(plainDateTime.[[ISOYear]], plainDateTime.[[ISOMonth]], plainDateTime.[[ISODay]], plainDateTime.[[Calendar]]).
return create_temporal_date(global_object, plain_date_time->iso_year(), plain_date_time->iso_month(), plain_date_time->iso_day(), plain_date_time->calendar());
}
// c. If item has an [[InitializedTemporalDateTime]] internal slot, then // c. If item has an [[InitializedTemporalDateTime]] internal slot, then
if (is<PlainDateTime>(item_object)) { if (is<PlainDateTime>(item_object)) {

View file

@ -11,6 +11,23 @@ describe("correct behavior", () => {
expect(createdPlainDate.day).toBe(26); expect(createdPlainDate.day).toBe(26);
}); });
test("PlainDateTime instance argument", () => {
const plainDateTime = new Temporal.PlainDateTime(2021, 7, 26, 1, 2, 3);
const createdPlainDate = Temporal.PlainDate.from(plainDateTime);
expect(createdPlainDate.year).toBe(2021);
expect(createdPlainDate.month).toBe(7);
expect(createdPlainDate.day).toBe(26);
});
test("ZonedDateTime instance argument", () => {
const timeZone = new Temporal.TimeZone("UTC");
const zonedDateTime = new Temporal.ZonedDateTime(1627318123456789000n, timeZone);
const createdPlainDate = Temporal.PlainDate.from(zonedDateTime);
expect(createdPlainDate.year).toBe(2021);
expect(createdPlainDate.month).toBe(7);
expect(createdPlainDate.day).toBe(26);
});
// Un-skip once ParseISODateTime & ParseTemporalDateString are implemented // Un-skip once ParseISODateTime & ParseTemporalDateString are implemented
test.skip("PlainDate string argument", () => { test.skip("PlainDate string argument", () => {
const createdPlainDate = Temporal.PlainDate.from("2021-07-26"); const createdPlainDate = Temporal.PlainDate.from("2021-07-26");