2015-12-10 2 views
0

Я пытаюсь сравнить две строки, представляющие даты.JS не удается создать объект даты

var val1 = "02-12-2015"; 
var val2 = "27-11-2015"; 

var date1 = new Date(val1); 
var date2 = new Date(val2); 

Дата date1 Я получаю объект даты, но в дате2 Я получаю «Недействительная дата».
Кто-нибудь знает причину?

+0

Это потому, что JS читает дату в «мм-дд-гггг». Всегда старайтесь «yyyy-mm-dd» – Rajesh

+0

@ Rajesh-no, не делайте этого. Вручную разбирайте строки или используйте библиотеку, не доверяйте Дате для синтаксического анализа строк. – RobG

ответ

2

new Date() может анализировать несколько форматов даты, но DD-MM-YYYY не является одним из них. Самый близкий формат соответствия к вашей строке - MM-DD-YYYY, поэтому он пытается использовать день как месяц и наоборот. Это работает с вашим первым примером случайно, но не со вторым.

Вы можете преобразовать вашу дату, как это:

var pattern = /(\d{2})-(\d{2})-(\d{4})/; 
var date2 = new Date(val2.replace(pattern,'$3-$2-$1')); 

Формат YYYY-MM-DD убеждается нет неправильных толкований.

Более допустимые форматы описаны в Date.parse() documentation.

+1

или просто 'var date1 = new Date (val1.split (" - "). Reverse(). Join (" - "))' –

+0

Спасибо. это допустимый формат в php, не думал, что в js будет отличаться. Временные метки также различны? или он универсален? –

+0

Не разбирайте строки, используя конструктор Date или Date.parse (по сути, одно и то же), всегда вручную разбирайте строки. Либо используйте библиотеку, либо напишите функцию. Глупая часть - это функция, которая делает это правильно - это то же количество кода, что и ваш (см. [* Строка даты синтаксического анализа для даты в JavaScript *] (http: // stackoverflow.ком/вопросы/21076865/синтаксический-дата-строка-дата-в-JavaScript)). – RobG

-2

Когда передается один строковый аргумент, это строковое представление даты в формате, принятом методом Date.parse(). Конструктор Date (dateString) принимает строки даты форматирования RFC822 и ISO 8601.

Примеры строк даты в формате RFC822 включают «Пн, 15 авг. 2005 15:52:01 EDT +0000», «25 декабря 2010 г. 6:00:00 am» и «15 августа 2005». Обратите внимание, что поставка двухзначного года, как в «Mon, 15 Aug 05 15:52:01», не будет работать в JavaScript! Международная спецификация ISO (ISO 8601) определяет формат «YYYY-MM-DD», который устраняет неоднозначность, вызванную форматами dd/mm/yy и mm/dd/yy. Например, с использованием международного формата «3 апреля 2002 года» будет выражаться как «2002-04-03».

Конструкторы даты и функция ошибки Date.parse() вылетают. Вместо этого они приводят к значению NaN. Мы можем использовать это для проверки действительности даты. Ниже функции, которые могут быть применены к любой строке, чтобы определить, является ли или не представляет это приемлемый формат даты:

String.prototype.isValidDate = function isValidDate() { 
    return !isNaN(Date.parse(this)); 
} 

Таким образом, кажется дата новой даты() с параметром строки не являются допустимыми в соответствии как RFC822 и ISO 8601.

+0

Его скромный запрос всем тем, кто голосовал до него, пожалуйста, дайте мне знать, что в этом плохого. Я здесь, чтобы учиться, поэтому, пожалуйста, поправьте меня, если я ошибаюсь в любой момент ... Большое спасибо – Zia

+0

Не мой голос, но до ES5 был установлен ** нет ** указанный формат для строк даты. С тех пор существует только один формат, указанный ECMA-262, все остальные зависят от реализации. – RobG

1

Вы не должны использовать конструктор Date для синтаксического анализа строк, поскольку это крайне ненадежно. Всегда вручную разбирайте строки, используя свою собственную функцию или библиотеку. Чтобы разобрать формат в OP и проверьте значения, вы можете использовать простую функцию, как:

function parseDMY(s) { 
 

 
    // Get the number parts 
 
    var b = s.split(/\D/); 
 

 
    // Create a date 
 
    var d = new Date(b[2], --b[1], b[0]); 
 

 
    // Check that it's a valid date. If not, return a Date with time value 
 
    // set to NaN (per ES5 and ECMAScript 2015 standards) 
 
    return b[1] == d.getMonth()? d : new Date(NaN); 
 
} 
 

 
document.write(parseDMY('02-12-2015'))