From 8fe3891b15d0c6f1b0cef6072c6bace435f3709e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csaba=20Osztrogon=C3=A1c?= Date: Thu, 1 Oct 2020 16:34:59 +0200 Subject: [PATCH] Fix Date.parse to handle times without timezone properly (#4249) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://www.ecma-international.org/ecma-262/11.0/#sec-date.parse "When the UTC offset representation is absent, date-only forms are interpreted as a UTC time and date-time forms are interpreted as a local time." JerryScript-DCO-1.0-Signed-off-by: Csaba Osztrogonác csaba.osztrogonac@h-lab.eu --- .../ecma/builtin-objects/ecma-builtin-date.c | 14 +++++++++++++- tests/jerry/date-parse.js | 10 ++++++---- tests/test262-esnext-excludelist.xml | 1 - 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-date.c b/jerry-core/ecma/builtin-objects/ecma-builtin-date.c index 6a1285e55..e6ab34969 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-date.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-date.c @@ -293,6 +293,7 @@ ecma_builtin_date_parse_ISO_string_format (const lit_utf8_byte_t *date_str_curr_ day = ecma_date_parse_date_chars (&date_str_curr_p, date_str_end_p, 2, 1, 31); } + bool is_utc = true; /* 4. read time if any */ if (ecma_date_parse_special_char (&date_str_curr_p, date_str_end_p, 'T')) { @@ -367,13 +368,24 @@ ecma_builtin_date_parse_ISO_string_format (const lit_utf8_byte_t *date_str_curr_ ecma_number_t timezone_offset = ecma_date_make_time (hours, minutes, ECMA_NUMBER_ZERO, ECMA_NUMBER_ZERO); time += is_timezone_sign_negative ? timezone_offset : -timezone_offset; } + else + { + is_utc = false; + } } } if (date_str_curr_p >= date_str_end_p) { ecma_number_t date = ecma_date_make_day (year, month - 1, day); - return ecma_date_make_date (date, time); + + ecma_number_t result_date = ecma_date_make_date (date, time); + if (!is_utc) + { + result_date = ecma_date_utc (result_date); + } + + return result_date; } } return ecma_number_make_nan (); diff --git a/tests/jerry/date-parse.js b/tests/jerry/date-parse.js index 9de761a41..f5ab51590 100644 --- a/tests/jerry/date-parse.js +++ b/tests/jerry/date-parse.js @@ -98,17 +98,19 @@ assert (d == 1420070400000); d = Date.parse("2015-01-01"); assert (d == 1420070400000); +var timezoneOffsetMS = new Date(0).getTimezoneOffset() * 60000; + d = Date.parse("2015-01T00:00"); -assert (d == 1420070400000); +assert (d == 1420070400000 + timezoneOffsetMS); d = Date.parse("2015-01T00:00:00"); -assert (d == 1420070400000); +assert (d == 1420070400000 + timezoneOffsetMS); d = Date.parse("2015-01T00:00:00.000"); -assert (d == 1420070400000); +assert (d == 1420070400000 + timezoneOffsetMS); d = Date.parse("2015-01T24:00:00.000"); -assert (d == 1420156800000); +assert (d == 1420156800000 + timezoneOffsetMS); d = Date.parse("2015-01T00:00:00.000+03:00"); assert (d == 1420059600000); diff --git a/tests/test262-esnext-excludelist.xml b/tests/test262-esnext-excludelist.xml index 50c8fb6d2..864e18a10 100644 --- a/tests/test262-esnext-excludelist.xml +++ b/tests/test262-esnext-excludelist.xml @@ -695,7 +695,6 @@ -