diff --git a/Userland/Libraries/LibJS/Runtime/Date.cpp b/Userland/Libraries/LibJS/Runtime/Date.cpp index f68f27f307..4eb86742d8 100644 --- a/Userland/Libraries/LibJS/Runtime/Date.cpp +++ b/Userland/Libraries/LibJS/Runtime/Date.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -356,24 +357,18 @@ Value make_day(GlobalObject& global_object, Value year, Value month, Value date) // 4. Let dt be 𝔽(! ToIntegerOrInfinity(date)). auto dt = MUST(date.to_integer_or_infinity(global_object)); // 5. Let ym be y + 𝔽(floor(ℝ(m) / 12)). - auto ym = Value(y + floor(m / 12)); + auto ym = y + floor(m / 12); // 6. If ym is not finite, return NaN. - if (!ym.is_finite_number()) + if (!Value(ym).is_finite_number()) return js_nan(); // 7. Let mn be 𝔽(ℝ(m) modulo 12). - // NOTE: This calculation has no side-effects and is unused, so we omit it + auto mn = modulo(m, 12); // 8. Find a finite time value t such that YearFromTime(t) is ym and MonthFromTime(t) is mn and DateFromTime(t) is 1𝔽; but if this is not possible (because some argument is out of range), return NaN. - if (!AK::is_within_range(y) || !AK::is_within_range(m + 1)) + if (!AK::is_within_range(ym) || !AK::is_within_range(mn + 1)) return js_nan(); - // FIXME: Core::DateTime assumes the argument values are in local time, which is not the case here. - // Let mktime() think local time is UTC by temporarily overwriting the TZ environment variable, - // so that the values are not adjusted. Core::DateTime should probably learn to deal with both - // local time and UTC time itself. - auto* tz = getenv("TZ"); - VERIFY(setenv("TZ", "UTC", 1) == 0); - auto t = Core::DateTime::create(static_cast(y), static_cast(m + 1), 1).timestamp() * 1000; - tz ? setenv("TZ", tz, 1) : unsetenv("TZ"); + auto t = days_since_epoch(static_cast(ym), static_cast(mn) + 1, 1) * MS_PER_DAY; + // 9. Return Day(t) + dt - 1𝔽. return Value(day(static_cast(t)) + dt - 1); }