Узел JS анализирует новую дату ("12345") до "+ 012345-01-01T06: 00: 00.000Z" (год 12345) - PullRequest
0 голосов
/ 27 июня 2019

Когда я тестирую этот код в браузере, он обрабатывает даты логическим способом (invalid date), но в NodeJS new Date("12345") создает +012345-01-01T06:00:00.000Z

Вот мой тест для NodeJS

$ node -e 'console.log(new Date("12345"))'
// outputs: +012355-01-01T06:00:00.000Z

Здесь вы можете запустить его в браузере

console.log(new Date("12345"))
// outputs: null

Есть идеи, почему это происходит?И как мне этого избежать?

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Это зависит от движка JavaScript.В Firefox даты после 1 января 10000 (год десять тысяч), по-видимому, считаются недействительными:

> new Date("9999")
Date 9999-01-01T00:00:00.000Z

> new Date("10000")
Invalid Date

В Chrome (который использует V8, так же, как Node.js) он отлично работает:

> new Date("10000")
Sat Jan 01 10000 00:00:00 GMT-0800 (Pacific Standard Time)
> new Date("12345")
Mon Jan 01 12345 00:00:00 GMT-0800 (Pacific Standard Time)

Итак, чтобы ответить на ваш вопрос: разные движки JavaScript имеют разные ограничения, связанные с тем, какая дата действительна, а какая нет, но в целом наличие только последовательности цифр в строке заставляет думать, что это 1 января этого года.(с поправкой на используемый часовой пояс):

> new Date("2019")
Mon Dec 31 2018 16:00:00 GMT-0800 (Pacific Standard Time)

Также обратите внимание на это.Chrome / Node.js:

> new Date("31")
Invalid Date
> new Date("32")
Thu Jan 01 2032 00:00:00 GMT-0800 (Pacific Standard Time)

Firefox:

> new Date("1000")
Date 1000-01-01T00:00:00.000Z

> new Date("999")
Invalid Date

Судя по всему, Firefox хочет, чтобы год имел ровно 4 цифры, тогда как Chrome / V8 более гибок.

Кроме того, похоже, что Chrome / V8 имеет разные логические даты разбора от "1" до "12" (используя их как месяцы), но это совершенно другая история.

0 голосов
/ 27 июня 2019

В качестве ответа на вопрос, как избежать этой проблемы, вы можете стандартизировать преобразование значения в дату следующим образом:

// all of these will produce the same date
const stringDate = "1970-01-01T00:00:12.345Z";
const numberString = "  12345  ";
const number = 12345;

function toDate(value) {
  if (typeof value === "string" && /^\d+$/.test(value.trim())) {
    value = parseInt(value);
  }
  return new Date(value)
}

console.log("string date", toDate(stringDate));
console.log("number string", toDate(numberString));
console.log("number", toDate(number));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...