summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibJS/Runtime/Date.cpp19
1 files changed, 7 insertions, 12 deletions
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 <AK/StringBuilder.h>
+#include <AK/Time.h>
#include <LibCore/DateTime.h>
#include <LibJS/Runtime/AbstractOperations.h>
#include <LibJS/Runtime/Date.h>
@@ -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<int>(y) || !AK::is_within_range<int>(m + 1))
+ if (!AK::is_within_range<int>(ym) || !AK::is_within_range<int>(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<int>(y), static_cast<int>(m + 1), 1).timestamp() * 1000;
- tz ? setenv("TZ", tz, 1) : unsetenv("TZ");
+ auto t = days_since_epoch(static_cast<int>(ym), static_cast<int>(mn) + 1, 1) * MS_PER_DAY;
+
// 9. Return Day(t) + dt - 1𝔽.
return Value(day(static_cast<double>(t)) + dt - 1);
}