2010-07-27 2 views
2

У меня есть следующий код, который должен попытаться проанализировать данную дату. Если это не удается, то по умолчанию текущая дата:Как проверить правильность синтаксического анализа новой даты («некоторая дата»)?

var date = new Date(textbox.value); // Try to parse 
if (isNaN(date)) date = new Date(); // Default to current 

Теперь я использую IsNaN(), чтобы проверить, если он был в состоянии правильно разобрать, например, чтобы проверить, что новый Date() не вернулся «Invalid Дата'.

Это похоже на работу в IE, FF и Chrome, но не работает на сафари. Например, если он пытается разобрать пустую строку для даты, иногда она думает, что это 1970 год, и иногда она считает, что это неверная дата. Вот отрывок из консоли сафари JS:

a=new Date("") <-- This thinks it's 1970 for some reason 
Thu Jan 01 1970 11:00:00 GMT+1100 (AUS Eastern Daylight Time) 

b=new Date("abc") <-- Fails of course, which is good 
Invalid Date 

c=new Date("") <-- Why does this fail now, whereas it thought it was 1970 before? 
Invalid Date 

isNaN(a) <-- Why is it successfully parsing an empty string for a date? 
false 

isNaN(b) <-- Fair enough 
true 

isNaN(c) <-- This is what i'd expect, but why is it different now? 
true 

Не уверен, Что происходит здесь, спасибо

ответ

4

Что Safari? Для меня не бывает:

> a= new Date('') 
Invalid Date 
> isNaN(a) 
true 

на Safari 4.0 (любая ОС).

В целом, хотя JavaScript Date синтаксический анализ традиционно в значительной степени неуточнен и полностью ненадежен. Вы не хотите полагаться на него для пользовательских значений ввода, поскольку оно будет демонстрировать непоследовательное и часто неуместное поведение в браузерах, платформах и локалях. Обычно лучше написать собственный синтаксический анализатор (или использовать одну из существующих библиотек даты, например, fleegix).

+0

Я использую Safari 5 на WinXP. И да, это парсинг дат, которые генерируются кодом, а не пользователем, поэтому я не беспокоюсь об этой стороне вещей. – Chris

+0

В результате я изменил свой код, чтобы, если бы он был пустой строкой, предположим, что это недопустимая дата (а также тест isNaN) – Chris

+0

Ах, вы правы, это новое поведение только в Safari 5. Как очень странно ... ага, это просто еще одна бородавка, чтобы добавить к длинному списку синтаксического анализа даты. Ручная проверка определенно вызвана. – bobince

Смежные вопросы