Почему движок JavaScript в Chrome V8 распознает «TG-1» через «TG-12» в качестве действительных дат / времени? - PullRequest
5 голосов
/ 08 мая 2019

Я реализовал синтаксический анализатор CSV, который угадывает форматы типов для каждого столбца, но я обнаружил, что класс JavaScript Date считает «TG-1» допустимой датой / временем.

Это какой-то неясный формат датыЯ еще не видел, чтобы Chrome поддерживал?Я не думаю, что это действительная дата, и, глядя на другую дату, стандарты ISO я не видел ссылки на это.

Chrome 74 говорит, что она действительна.

Firefox 64 говорит, что это не такдопустимо.

let validDate = true;
try{
   d = new Date("TG-1");
   d.toISOString()
}catch(e){
   validDate = false
}
console.log(validDate);

Любая строка, за которой следует - и число 1-12, считается действительной:

d = new Date("adsfadgag-12")//valid per V8

1 Ответ

1 голос
/ 08 мая 2019

Цитировать из V8 исходного кода :

Наследственные даты:

Любое нераспознанное слово перед первым номером игнорируется.

Текст в скобках игнорируется.

Число без знака, за которым следует «:», является значением времени и добавляется в TimeComposer. Число, за которым следует '::', также добавляет второй ноль. Номер, за которым следует «.» также время и должно сопровождаться миллисекундами.

Любой другой номер является компонентом даты и добавляется в DayComposer. Название месяца (или на самом деле: любое слово, имеющее те же первые три буквы, что и название месяца) записывается как названный месяц в Компоновщике дня. Слово, распознаваемое как часовой пояс, записывается как таковое, как (+|-)(hhmm|hh:).

Устаревшие даты не допускают дополнительных знаков ('+' или '-') или не совпадают ')' после того, как число было прочитано (перед первым числом разрешен любой мусор).

Пересечение двух: строка, которая соответствует обоим форматам (например, 1970-01-01), будет проанализирована как строка даты и времени ES5 - что означает, что по умолчанию используется часовой пояс UTC. Это неизбежно, если следовать спецификации ES5.

После считывания действительной буквы "T" во время сканирования строки даты и времени ES5 ввод больше не может быть действительной устаревшей датой, поскольку после считывания числа "T" является строкой мусора.

Другими словами: это поведение на самом деле не запланировано, просто некоторые браузеры иногда так себя ведут, и поэтому это странное поведение необходимо сохранить. Date(...) постарается разобрать практически все что угодно без жалоб.

...