Explorar o código

LibJS: Fix modulo in get_iso_parts_from_epoch() for negative epoch ns

This now matches the spec change from reminder() to modulo which was
done here: https://github.com/tc39/proposal-temporal/commit/bdf60f5
Linus Groh %!s(int64=3) %!d(string=hai) anos
pai
achega
c56e5139f5

+ 1 - 1
Userland/Libraries/LibJS/Runtime/Temporal/TimeZone.cpp

@@ -121,7 +121,7 @@ ISODateTime get_iso_parts_from_epoch(BigInt const& epoch_nanoseconds)
     // 1. Assert: epochNanoseconds is an integer.
 
     // 2. Let remainderNs be epochNanoseconds modulo 10^6.
-    auto remainder_ns_bigint = epoch_nanoseconds.big_integer().divided_by(Crypto::UnsignedBigInteger { 1'000'000 }).remainder;
+    auto remainder_ns_bigint = modulo(epoch_nanoseconds.big_integer(), Crypto::UnsignedBigInteger { 1'000'000 });
     auto remainder_ns = remainder_ns_bigint.to_double();
 
     // 3. Let epochMilliseconds be (epochNanoseconds − remainderNs) / 10^6.

+ 6 - 0
Userland/Libraries/LibJS/Tests/builtins/Temporal/ZonedDateTime/ZonedDateTime.prototype.toString.js

@@ -10,6 +10,12 @@ describe("correct behavior", () => {
         expect(zonedDateTime.toString()).toBe("2021-11-03T01:33:05.1002003+00:00[UTC]");
     });
 
+    test("negative epoch nanoseconds", () => {
+        const timeZone = new Temporal.TimeZone("UTC");
+        const zonedDateTime = new Temporal.ZonedDateTime(-999_999_999n, timeZone);
+        expect(zonedDateTime.toString()).toBe("1969-12-31T23:59:59.000000001+00:00[UTC]");
+    });
+
     test("fractionalSecondDigits option", () => {
         const plainDateTime = new Temporal.PlainDateTime(2021, 11, 3, 1, 33, 5, 100, 200, 300);
         const timeZone = new Temporal.TimeZone("UTC");