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

вопрос создан в Wed, May 8, 2019 12:00 AM

Я реализовал синтаксический анализатор 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
    
5
  1. При попытке создать дату с бессмысленной строкой исключение не выдается. Вы просто получаете объект Date, который не работает.
    2019-05-08 16: 06: 55Z
  2. Похоже, что конструктор игнорирует ваш бит TG и видит 1 как Jan для 2001.
    2019-05-08 16: 07: 00Z
  3. Посмотрите, что вам показывает console.log(d).
    2019-05-08 16: 07: 33Z
  4. @ Николас, это может быть любая произвольная строка, за которой следует - d = новая дата ("adsfadgag-12") действительна
    2019-05-08 16: 11: 51Z
  5. @ Keith d = new Date("adsfadgag-12") //также действителен для V8
    2019-05-08 16: 24: 33Z
1 ответ                              1                         

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

  

Устаревшие даты:

     

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

     

Заключенный в скобки текст игнорируется.

     

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

     

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

     

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

     

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

     

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

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

    
1
2019-05-08 16: 32: 05Z
источник размещен Вот