]> git.kaiwu.me - njs.git/commitdiff
Date: fix UTC setters
authorDmitry Volyntsev <xeioex@nginx.com>
Sat, 12 Sep 2026 03:33:48 +0000 (20:33 -0700)
committerDmitry Volyntsev <xeioexception@gmail.com>
Mon, 14 Sep 2026 17:53:52 +0000 (10:53 -0700)
The Date setters always converted their result as local time.  Use the
setter's UTC flag instead.

Remove the intermediate range check in njs_make_date().  TimeClip already
checks the result after local-to-UTC conversion, which can move a value
across the valid time range boundary.

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

index 57d92ee34795adc9b07d87b88ad06b9280e998f7..be8f6233cfad37980e111ed606c80988f96fd842 100644 (file)
@@ -262,10 +262,6 @@ njs_make_date(int64_t tm[], njs_bool_t local)
 
     time += days * 86400000.0;
 
-    if (time < -8.64e15 || time > 8.64e15) {
-        return NAN;
-    }
-
     if (local) {
         time += njs_tz_offset(time) * 60000;
     }
@@ -1488,7 +1484,7 @@ njs_date_prototype_set_fields(njs_vm_t *vm, njs_value_t *args,
 
     } while (--left);
 
-    time = njs_make_date(tm, 1);
+    time = njs_make_date(tm, magic & 0x40);
 
 done:
 
@@ -1726,4 +1722,3 @@ const njs_object_type_init_t  njs_date_type_init = {
    .prototype_props = &njs_date_prototype_init,
    .prototype_value = { .object = { .type = NJS_OBJECT } },
 };
-
index e6368d8ce3cebbb28f937fe5ea07b020cc77c8cf..3528be7dfab83cb0207eea0d2737dbbb40596b69 100644 (file)
@@ -22469,6 +22469,10 @@ static njs_unit_test_t  njs_tz_test[] =
                   "d.getTime()"),
        njs_str("1299733323625") },
 
+     { njs_str("var d = new Date(Date.UTC(2016, 6)); d.setUTCMonth(6, 6);"
+                  "d.getTime()"),
+       njs_str("1467763200000") },
+
      { njs_str("var d = new Date(1308895323625); d.setMonth(2);"
                   "d.getTime()"),
        njs_str("1300942923625") },