Commit graph

39 commits

Author SHA1 Message Date
Luke Wilde
78db4e683f LibJS: Add "Month dd, yy hh:mm:ss" Date format
Required by Discord's Birthday page.
2023-05-22 06:07:05 +02:00
Hendiadyoin1
b76d3f287f LibJS: Make yy{/,-}mm{/,-}dd hh:mm test timezone independent
Otherwise this will fail in non UTC timezones.
2023-03-23 13:33:03 -04:00
Luke Wilde
f0d0459c3e LibJS: Support the yy{/,-}mm{/,-}dd hh:mm format for Date
Required by a UK news website for loading a Piano configuration.
This is presumably configuration for piano.io Analytics.
2023-03-23 13:38:08 +01:00
Timothy Flynn
24459a44b0 LibJS: Ensure Date tests can pass in any time zone by testing UTC values
When we create a Date object from a timestamp, or set its value by way
of Date.prototype.setTime, the timestamp is interpreted as UTC. Change
test expecatations against such instances to use UTC as well.
2023-03-21 18:05:22 +00:00
Luke Wilde
ce39c907fd LibJS: Support MM/DD/YYYY HH:MM <timezone-offset> format for Date
Required by Discord to determine if it should show Christmas themed
loading tips on the loading screen.
Fixes #16473.
2022-12-13 21:42:28 +00:00
Timothy Flynn
b077fccd3d LibLocale+LibJS: Update to CLDR version 42.0.0
There were some notable changes to the CLDR JSON format and data in this
release.

The patterns for a date at a specific time, i.e. "{date} at {time}", now
appear under the "atTime" attribute of the "dateTimeFormats" object.

Locale specific changes that affected test-js:

All locales:

* In many patterns, the code points U+00A0 (NO-BREAK SPACE) and U+202F
  (NARROW NO-BREAK SPACE) are now used in place of an ASCII space. For
  example, before the "dayPeriod" fields AM and PM.

* Separators such as U+2013 (EN DASH) are now surrounded by U+2009 (THIN
  SPACE) in place of an ASCII space character.

Locale "en":

* Narrow localizations of time formats are even more narrow. For
  example, the abbreviation "wk." for "week" is now just "wk".

Locale "ar":

* The code point U+060C (ARABIC COMMA) is now used in place of an ASCII
  comma.

* The code point U+200F (RIGHT-TO-LEFT MARK) now appears at the
  beginning of many localizations.

* When the "latn" numbering system is used for currency formatting, the
  currency symbol more consistently is placed at the end of the pattern.

Locale "he":

* The "many" plural rules category has been removed.

Locales "zh" and "es-419":

* Several display-name localizations were changed.
2022-10-25 10:10:39 +01:00
davidot
03c468fb7d LibJS: Parse date strings like "9/17/2022" 2022-09-17 18:53:14 +02:00
Idan Horowitz
9098257668 LibJS: Reject -00000 as extended year in Date parsing 2022-04-30 21:36:27 +02:00
davidot
a61424a62b LibJS: Be more lenient when parsing milliseconds for Date
Other engines don't give NaN if there is at least one digit after the
dot for milliseconds. We were much stricter and required exactly three
digits.
But there is real world usage of different amounts of digits such as
discord having three extra trailing zeros.
2022-03-09 14:18:59 +01:00
Timothy Flynn
30a143c79e LibJS: Explicitly handle invalid Date objects in UTC time setters
This is a normative change in the ECMA-262 spec:
https://github.com/tc39/ecma262/commit/ca53334

Note that this also fixes a few errors where we errantly converted the
stored time value to local time.
2022-02-04 13:47:50 +00:00
Timothy Flynn
fd7d0a31d9 LibJS: Explicitly handle invalid Date objects in local time setters
This is a normative change in the ECMA-262 spec:
https://github.com/tc39/ecma262/commit/ca53334
2022-02-04 13:47:50 +00:00
Timothy Flynn
9cd93944b8 LibJS: Change test conditions to pass in all time zones
Mostly slapping "timeZone: UTC" on DateTimeFormat tests (we have other
tests for specific time zones). Also pick dates that are not on DST
boundaries in some time zones where that matters.
2022-01-21 19:14:38 +00:00
Timothy Flynn
c74f75b910 LibJS: Implement Date.prototype.setUTCDate 2022-01-16 11:07:02 +01:00
Timothy Flynn
0d73da0328 LibJS: Implement Date.prototype.setUTCFullYear 2022-01-16 11:07:02 +01:00
Timothy Flynn
51bc973ecc LibJS: Implement Date.prototype.setUTCHours 2022-01-16 11:07:02 +01:00
Timothy Flynn
6998c0a796 LibJS: Implement Date.prototype.setUTCMilliseconds 2022-01-16 11:07:02 +01:00
Timothy Flynn
2f202e8ef4 LibJS: Implement Date.prototype.setUTCMinutes 2022-01-16 11:07:02 +01:00
Timothy Flynn
f2ffe3bf90 LibJS: Implement Date.prototype.setUTCMonth 2022-01-16 11:07:02 +01:00
Timothy Flynn
c71877b0a6 LibJS: Implement Date.prototype.setUTCSeconds 2022-01-16 11:07:02 +01:00
Timothy Flynn
6576d0291c LibJS: Implement Date.prototype.getTimezoneOffset 2022-01-15 20:13:48 +01:00
Timothy Flynn
d83ce7dd0b LibJS: Re-implement the Date constructor / prototype for spec compliance
First, this adds a constructor to the Date object to be created from a
plain double. This is a first step to removing Core::DateTime as the
basis for the Date object. A subsequent commit will remove the now-
unused data from the object.

Next, this implements the constructor in accordance to the spec. The
constructor when NewTarget is undefined no longer allocates a Date on
the heap. The other constructor properly uses recently created AOs to
handle time zone and ensure the created [[DateValue]] is valid. Other
methods on the constructor (Date.now) have not been touched yet.

Last, the prototype is reimplemented. Again, we use other AOs to handle
time zones and time clipping. Not all prototypes are fixed; most of them
are, but a few (e.g. Date.prototype.getTimezoneOffset) were not fixed,
but left in a mostly unimplemented state for another commit.

In all of the above, spec comments are added. This is a rather large
change; but it's tough to do any of these parts individually without
breaking everything else.
2022-01-15 20:13:48 +01:00
Timothy Flynn
643992904c LibJS: Clip parsed IS0 8601 strings to +/- 8.64e15 2022-01-14 22:39:06 +01:00
Timothy Flynn
260d2099da LibJS: Implement Date.UTC according to the spec
This fixes all failing Date.UTC test262 tests, which failed due to not
handling invalid input and evaluating inputs out of order. But this also
avoids using timegm(), which doesn't work on macOS for years before 1900
(they simply return -1 for those years).

Partially addresses #4651. Date.parse.js still fails.
2022-01-05 20:05:12 +01:00
Timothy Flynn
e8f860048e LibJS: Set the length of Date.UTC to 7
This is a bit unusual because there is only 1 required argument, but the
spec dictates that the length is 7.
2022-01-05 20:05:12 +01:00
Timothy Flynn
2e4e0195de LibJS: Implement ECMA-402 Date.prototype.toLocaleTimeString 2021-12-10 13:58:33 +00:00
Timothy Flynn
4d310fd7aa LibJS: Implement ECMA-402 Date.prototype.toLocaleDateString 2021-12-10 13:58:33 +00:00
Timothy Flynn
9a62c01ebc LibJS: Implement ECMA-402 Date.prototype.toLocaleString 2021-12-10 13:58:33 +00:00
Timothy Flynn
76589d6728 LibJS: Change wording of ErrorType::NotA to be independent of context
Currently, we have NotA and NotAn, to be used dependent on whether the
following word begins with a vowel or not. To avoid this, change the
wording on NotA to be independent of this context.
2021-09-12 00:16:39 +02:00
Linus Groh
a8ba2f4b21 LibJS/Tests: Fix bad copy and paste that crept into a lot of tests
The top-level function should have been `describe()``, but instead it's
been nested `test()`s.
2021-08-07 12:10:34 +01:00
Linus Groh
a647f0abf6 LibJS: Make parse_simplified_iso8601() use Optional<int> instead of -1
...for the non-success state. This fixes a crash when parsing dates with
the year -1, as we would assert successful parsing ("year != -1").
Mixing Optional and -1 seems worse and more complicated than just using
Optional for all the values, so I did that instead.
2021-07-10 19:51:07 +01:00
Linus Groh
39cdffd78d LibJS: Make Date.now() return a floor()'d milliseconds value
It is defined as follows:

    21.4.3.1 Date.now ( )
    https://tc39.es/ecma262/#sec-date.now

    The now function returns the time value designating the UTC date and
    time of the occurrence of the call to now.

"Time value" is defined as:

    21.4.1.1 Time Values and Time Range
    https://tc39.es/ecma262/#sec-time-values-and-time-range

    An ECMAScript time value is a Number, either a finite integral
    Number representing an instant in time to millisecond precision or
    NaN representing no specific instant.

By flooring the value we match the behavior in the Temporal proposal's
Temporal.ZonedDateTime.prototype.epochMilliseconds getter:

    4. Let ms be RoundTowardsZero(ℝ(ns) / 10^6).

With that being defined as:

    13.30 RoundTowardsZero ( x )
    https://tc39.es/proposal-temporal/#sec-temporal-roundtowardszero

    1. Return the mathematical value that is the same sign as x and
    whose magnitude is floor(abs(x)).

This is makes the last of the currently 15 Temporal tests in test262
work, which compares Temporal.now.instant() with Date.now() :^)
2021-07-10 19:51:07 +01:00
Linus Groh
9f2dd89446 LibJS/Tests: Add tests for Date.prototype.toTemporalInstant() 2021-07-09 13:20:51 +01:00
Idan Horowitz
17afe015a5 LibJS: Add Date.prototype.setTime() 2021-06-06 19:14:11 +01:00
Idan Horowitz
a93b1c7ea0 LibJS: Add Date.prototype.setMonth() 2021-06-06 19:14:11 +01:00
Idan Horowitz
59034554a4 LibJS: Account for differences in month representations (0-11 vs 1-12)
Since DateTime stores months as 1 to 12, while JS accepts months as
0 to 11, we have to account for the difference (by subtracting or
adding 1) where appropriate.
2021-06-06 19:14:11 +01:00
Idan Horowitz
b893963651 LibJS: Add Date.prototype.setDate() 2021-06-06 19:14:11 +01:00
Petróczi Zoltán
ca49f96b78 LibJS Date: Added "Invalid Date".
Setting an invalid value on a Date object now makes it invalid.
Setting it again but with correct values makes it valid again.
2021-03-22 20:58:22 +01:00
tuqqu
43f0c92bcd LibJS: Add Date methods: setHours, setMinutes, setSeconds, setMilliseconds 2021-03-19 23:08:21 +01:00
Andreas Kling
13d7c09125 Libraries: Move to Userland/Libraries/ 2021-01-12 12:17:46 +01:00