]> git.kaiwu.me - njs.git/commitdiff
Fixed Date.parse() with ISO-8601 date-only forms.
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 13 Jun 2023 03:51:54 +0000 (20:51 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Tue, 13 Jun 2023 03:51:54 +0000 (20:51 -0700)
According to the spec 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.

src/njs_date.c
src/test/njs_unit_test.c

index 7df50725c81b40b4dd508b6bf62cd6919925ef94..b8eab0041d4d83705a0d1579c741b68d932f8c1f 100644 (file)
@@ -530,6 +530,8 @@ njs_date_string_parse(njs_value_t *date)
     next = njs_date_number_parse(&tm[NJS_DATE_YR], p, end, 4);
 
     if (next != NULL) {
+        utc = 1;
+
         /* ISO-8601 format: "1970-09-28T06:00:00.000Z" */
 
         if (next == end) {
@@ -592,7 +594,6 @@ njs_date_string_parse(njs_value_t *date)
             return NAN;
         }
 
-        utc = 1;
         end--;
 
         if (*end != 'Z') {
@@ -636,6 +637,8 @@ njs_date_string_parse(njs_value_t *date)
             tm[NJS_DATE_MSEC] *= 10;
         }
 
+done:
+
         return njs_make_date(tm, !utc);
     }
 
@@ -683,8 +686,6 @@ njs_date_string_parse(njs_value_t *date)
         week = 0;
     }
 
-done:
-
     return njs_make_date(tm, 0);
 }
 
index d09275ceba70b2a26824a35cc2eb12c0aacc7e11..ad47940e6d322a7944c48b62267680aa4ee77119 100644 (file)
@@ -16178,6 +16178,13 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("Date.parse('2011-06-24T06:01:02.625555Z5')"),
       njs_str("NaN") },
 
+    { njs_str("var tzoffzet = new Date(0).getTimezoneOffset() * 60000;"
+              "Date.parse('1970-01-01T00:00:00') == tzoffzet"),
+      njs_str("true") },
+
+    { njs_str("Date.parse('1970-01-01')"),
+      njs_str("0") },
+
     { njs_str("var d = new Date(); var str = d.toISOString();"
                  "var diff = Date.parse(str) - Date.parse(str.substring(0, str.length - 1));"
                  "d.getTimezoneOffset() == -diff/1000/60"),