2016-05-24 2 views
-2

Я пытаюсь проверить на разных платформах и в браузерах, является ли дата действительной датой или нет.Подтвердить дату, указанную в далекой дате

Я попытался следующие, и она работала последовательно accross браузерами (IE5 +, Firefox, Chrome):

isNaN(new Date())
--> false

isNaN(new Date(0))
--> false

isNaN(new Date("Fri May 20 2016 12:58:52 GMT+0530"))
--> false

isNaN(new Date("asd"))
--> true

Первые три являются действительными датами и везде, где выход ложно это означает, что дата является действительной.

Пожалуйста, подтвердите, правильно ли это.

PS: Этот вопрос касается не форматов даты. Этот вопрос касается определения того, действительна ли дата Javascript Date или нет. Например, в тестах выше new Date("asd"), очевидно, не является датой.

+0

Я не понимаю голоса без комментариев или даже одного закрытого голосования. – RobG

ответ

-2

Javascript - это хороший способ проверить валидацию между браузерами. Если вы можете получить ваши даты в обычном формате дд/мм/гггге, вот хороший пример регулярного выражения проверки, чтобы проверить, что строка даты действует: -

var theDate = '31/12/2016' 
    var reg = /(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d/; 
    return theDate.match(reg); 

Надеется, что это помогает!

+1

'dd/mm/yyyy' не является« нормальным »форматом, так как он зависит от вашего языка. 'YYYY-MM-DDTHH: mm: ss.sssZ' (* ISO 8601 *) является гораздо более стандартным. –

+0

@Steveo, этот вопрос касается не форматов даты. Этот вопрос касается определения того, действительна ли дата Javascript 'Date' или нет. –

+0

@ C.Champagne - это не совсем о «locale», а пользовательских настройках. Американцы, вероятно, хотят видеть mm/dd/yyyy, независимо от того, где они находятся. ISO 8601 является «более стандартным», потому что он ** является стандартом. ;-) – RobG

0

В коде:

isNaN(new Date()) 
--> false 

Здесь новый Date() создает действительную новую дату. IsNaN затем вызывает ToNumber на вновь созданном Дата, который вернет его значение времени, которое не является NaN, так что возвращаемое значение ложь.

isNaN(new Date(0)) 
--> false 

Это создает действительную дату с временным значением 0 (эквивалентно 1970-01-01T00: 00: 00Z), который не является NaN так возвращает ложь.

isNaN(new Date("Fri May 20 2016 12:58:52 GMT+0530")) 
--> false 

Это может или не может создать действительный объект Date, так как это зависит от реализации зависимого поведения парсера, чтобы создать действительную дату (или нет). Таким образом, проблема с возвратом true или false является проблематичной.

isNaN(new Date("asd")) 
--> true 

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

Beyound testing, вы всегда можете прочитать спецификацию. В нем указано, что недопустимый объект Date имеет значение времени NaN. Таким образом, надежный способ определить, действительно ли это действительная дата или нет, - либо проверить значение времени, либо значение, возвращаемое любым из , получить методы (getYear, getMonth и т. Д.).

Любой из следующих будет делать:

var d0 = new Date(NaN) // Create an invalid date. 
 
var d1 = new Date(2016) // Create a valid date 
 

 
// Tests for invalid date 
 
// Let isNaN coerce the date to Number 
 
console.log(isNaN(d0) + ' : ' + isNaN(d1)) 
 
// Test the time value explicitly 
 
console.log(isNaN(d0.getTime()) + ' : ' + isNaN(d1.getTime())); 
 
// Use unary + to coerce the Date to Number 
 
console.log(isNaN(+d0) + ' : ' + isNaN(+d1)); 
 
// Use a get method 
 
console.log(isNaN(d0.getDate()) + ' : ' + isNaN(d1.getDate())); 
 

 
// Not using isNaN - test the value returned by *toString* 
 
console.log((d0.toString() == 'Invalid Date') + ' : ' + (d1.toString() == 'Invalid Date'));

Последний метод не так надёжен, так как Date.prototype.toString могут быть перезаписаны и возвращать другое значение (не хорошая идея или вероятно, но возможно).

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