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:
committed by
GitHub
parent
e227634b45
commit
8fe3891b15
@@ -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);
|
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 */
|
/* 4. read time if any */
|
||||||
if (ecma_date_parse_special_char (&date_str_curr_p, date_str_end_p, 'T'))
|
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);
|
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;
|
time += is_timezone_sign_negative ? timezone_offset : -timezone_offset;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
is_utc = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (date_str_curr_p >= date_str_end_p)
|
if (date_str_curr_p >= date_str_end_p)
|
||||||
{
|
{
|
||||||
ecma_number_t date = ecma_date_make_day (year, month - 1, day);
|
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 ();
|
return ecma_number_make_nan ();
|
||||||
|
|||||||
@@ -98,17 +98,19 @@ assert (d == 1420070400000);
|
|||||||
d = Date.parse("2015-01-01");
|
d = Date.parse("2015-01-01");
|
||||||
assert (d == 1420070400000);
|
assert (d == 1420070400000);
|
||||||
|
|
||||||
|
var timezoneOffsetMS = new Date(0).getTimezoneOffset() * 60000;
|
||||||
|
|
||||||
d = Date.parse("2015-01T00:00");
|
d = Date.parse("2015-01T00:00");
|
||||||
assert (d == 1420070400000);
|
assert (d == 1420070400000 + timezoneOffsetMS);
|
||||||
|
|
||||||
d = Date.parse("2015-01T00:00:00");
|
d = Date.parse("2015-01T00:00:00");
|
||||||
assert (d == 1420070400000);
|
assert (d == 1420070400000 + timezoneOffsetMS);
|
||||||
|
|
||||||
d = Date.parse("2015-01T00:00:00.000");
|
d = Date.parse("2015-01T00:00:00.000");
|
||||||
assert (d == 1420070400000);
|
assert (d == 1420070400000 + timezoneOffsetMS);
|
||||||
|
|
||||||
d = Date.parse("2015-01T24:00:00.000");
|
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");
|
d = Date.parse("2015-01T00:00:00.000+03:00");
|
||||||
assert (d == 1420059600000);
|
assert (d == 1420059600000);
|
||||||
|
|||||||
@@ -695,7 +695,6 @@
|
|||||||
<test id="built-ins/DataView/toindex-byteoffset-sab.js"><reason></reason></test>
|
<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/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/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-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-two.js"><reason></reason></test>
|
||||||
<test id="built-ins/Date/proto-from-ctor-realm-zero.js"><reason></reason></test>
|
<test id="built-ins/Date/proto-from-ctor-realm-zero.js"><reason></reason></test>
|
||||||
|
|||||||
Reference in New Issue
Block a user