Javascript дата странности между Firefox и всеми остальными - PullRequest
5 голосов
/ 02 сентября 2010

Кто-нибудь знает, почему в Firefox, если вы выполните приведенный ниже код, он будет проверять его как дату, если переданная строка содержит четыре числа и только четыре числа? В любом другом браузере, который я тестировал (IE, Chrome), он всегда будет возвращаться как не дата.

Учитывая, что спецификация, как указывает Марсель Корпел ниже, утверждает, что она должна отступить, чтобы использовать запасной вариант Firefox для реализации, я действительно задаюсь вопросом, почему откат Firefox отображает эту аномалию.

function isDate(sDate) {  
    var temp = new Date(sDate);  
    if (temp.toString() == "NaN" || temp.toString() == "Invalid Date") {  
        alert("Not a Date");  
    } else {  
        alert("Is a Date!");  
    }
}

Ответы [ 4 ]

5 голосов
/ 02 сентября 2010

Если вы передаете строку конструктору Date, строка должна быть в формате, распознаваемом методом parse ( метки времени, соответствующие IETF RFC 1123 ) (источник: MDC ).Все остальное приводит к конкретному поведению реализации и будет отличаться в разных браузерах.

Я предлагаю вам вообще не использовать строки и использовать либо три числа, представляющие год, месяц и день (учтите, что числа месяца начинаются с 0 (=Январь)), или используйте одно число, количество миллисекунд с 1 января 1970 года 00:00:00 UTC.

ОБНОВЛЕНИЕ: с учетом вашего примера,

var a = new Date('0123');
console.log(a);

выводит

Fri Jan 01 0123 01:00:00 GMT+0100 (CET)

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

ОБНОВЛЕНИЕ 2: Я думаю MDCописание Date.parse содержит ответ на ваш вопрос:

Начиная с JavaScript 1.8.5, также может быть проанализировано подмножество строк даты в формате ISO 8601 .

На странице ISO 8601 указывается (раздел «Форматы»):

Год:
ГГГГ (например, 1997)
Год и месяц:
ГГГГ-ММ (например, 1997-07)
Полная дата:
ГГГГ-ММ-ДД (например, 1997-07-16)

Таким образом, полагаясь на ISO 8601, строка, содержащая только четыре числа, будет распознаваться как год.

1 голос
/ 13 марта 2013

Это работает во всех браузерах -

новая дата ('2001/01/31 12:00:00 AM')

1 голос
/ 20 декабря 2012

Не полагайтесь на проверку даты в javascript.Локальный формат даты и времени может создать некоторую проблему с объектом даты javascript.

использовать следующий подход

  • показать не редактируемое текстовое поле
  • в фокусе календаря отображения текстового поля
  • сделать пустую проверку, если поле имеетбыть обязательным
  • нет необходимости выполнять проверку даты, как если бы значение текстового поля не было пустым, это определенно будет дата.Мы не разрешаем пользователю вводить что-либо еще, и выбранное значение из календаря всегда будет Date:)
0 голосов
/ 02 сентября 2010

Я столкнулся с той же проблемой, что и в Firefox, по некоторым причинам я не могу объяснить, что любые 4-значные числовые символы являются допустимой датой в FF, в других браузерах это NaN:

Немного неприятная работа- для FF, но у меня это сработало:

function isDate(sDate) {  
    if(sDate.match(/^\d{4}$/))
       return false;
    var temp = new Date(sDate);  
    if (temp.toString() == "NaN" || temp.toString() == "Invalid Date") {  
        alert("Not a Date");  
    } else {  
        alert("Is a Date!");  
        return true;  
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...