static nxt_noinline double
njs_date_string_parse(njs_value_t *date)
{
- int ext, ms;
+ int ext, ms, ms_length, skipped;
+ double time;
struct tm tm;
- nxt_bool_t sign, week;
+ nxt_bool_t sign, week, utc;
const u_char *p, *next, *end;
njs_string_prop_t string;
return NAN;
}
- if (*p == '+') {
- p++;
- sign = 1;
-
- } else if (*p == '-') {
+ if (*p == '+' || *p == '-') {
p++;
sign = 1;
return NAN;
}
+ utc = 1;
+ end--;
+
+ if (*end != 'Z') {
+ utc = 0;
+ end++;
+ }
+
p = njs_date_time_parse(&tm, p + 1, end);
if (nxt_slow_path(p == NULL)) {
return NAN;
goto done;
}
- if (nxt_slow_path(p >= end || *p != '.')) {
+ if (nxt_slow_path(p > end || *p != '.')) {
return NAN;
}
- p = njs_date_number_parse(&ms, p + 1, end, 3);
+ p++;
+
+ ms_length = (end - p < 3) ? end - p : 3;
+
+ p = njs_date_number_parse(&ms, p, end, ms_length);
if (nxt_slow_path(p == NULL)) {
return NAN;
}
- if (nxt_slow_path(p >= end || *p != 'Z')) {
- return NAN;
+ if (end > p) {
+ p = njs_date_number_parse(&skipped, p, end, end - p);
+ if (nxt_slow_path(p == NULL)) {
+ return NAN;
+ }
+ }
+
+ if (ms_length == 1) {
+ ms *= 100;
+
+ } else if (ms_length == 2) {
+ ms *= 10;
+ }
+
+ if (utc) {
+ time = njs_timegm(&tm);
+
+ } else {
+ tm.tm_isdst = -1;
+ time = mktime(&tm);
}
- return njs_timegm(&tm) * 1000 + ms;
+ return time * 1000 + ms;
}
if (sign) {
{ nxt_string("Date.parse('2011-06-24T06')"),
nxt_string("NaN") },
- { nxt_string("Date.parse('2011-06-24T06:01')"),
+ { nxt_string("Date.parse('2011-06-24T06:')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Date.parse('2011-06-24T06:01:')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Date.parse('2011-06-24T06:01Z')"),
nxt_string("1308895260000") },
- { nxt_string("Date.parse('2011-06-24T06:01:02')"),
+ { nxt_string("Date.parse('2011-06-24T06:01:02:')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Date.parse('2011-06-24T06:01:02Z')"),
nxt_string("1308895262000") },
+ { nxt_string("Date.parse('2011-06-24T06:01:02.Z')"),
+ nxt_string("NaN") },
+
+ { nxt_string("Date.parse('2011-06-24T06:01:02.6Z')"),
+ nxt_string("1308895262600") },
+
+ { nxt_string("Date.parse('2011-06-24T06:01:02.62Z')"),
+ nxt_string("1308895262620") },
+
+ { nxt_string("Date.parse('2011-06-24T06:01:02:625Z')"),
+ nxt_string("NaN") },
+
{ nxt_string("Date.parse('2011-06-24T06:01:02.625Z')"),
nxt_string("1308895262625") },
+ { nxt_string("Date.parse('2011-06-24T06:01:02.6255555Z')"),
+ nxt_string("1308895262625") },
+
+ { nxt_string("Date.parse('2011-06-24T06:01:02.625555Z5')"),
+ nxt_string("NaN") },
+
+ { nxt_string("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"),
+ nxt_string("true") },
+
{ nxt_string("Date.parse('24 Jun 2011')"),
nxt_string("1308873600000") },