Fix Date.parse to handle times without timezone properly (#4249)

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
This commit is contained in:
Csaba Osztrogonác
2020-10-01 16:34:59 +02:00
committed by GitHub
parent e227634b45
commit 8fe3891b15
3 changed files with 19 additions and 6 deletions
@@ -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 ();
+6 -4
View File
@@ -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);
-1
View File
@@ -695,7 +695,6 @@
<test id="built-ins/DataView/toindex-byteoffset-sab.js"><reason></reason></test>
<test id="built-ins/DataView/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/Date/parse/time-value-maximum-range.js"><reason></reason></test>
<test id="built-ins/Date/parse/without-utc-offset.js"><reason></reason></test>
<test id="built-ins/Date/proto-from-ctor-realm-one.js"><reason></reason></test>
<test id="built-ins/Date/proto-from-ctor-realm-two.js"><reason></reason></test>
<test id="built-ins/Date/proto-from-ctor-realm-zero.js"><reason></reason></test>