2008-10-02 2 views
29

У меня есть проблема -Javascript Date() конструктор не работает

Javascript Date("mm-dd-yyyy") конструктор не работает для FF. Он отлично работает для IE.

  • IE: new Date("04-02-2008") =>"Wed Apr 2 00:00:00 EDT 2008"
  • FF2: new Date("04-02-2008") =>Invalid Date

Так давайте попробуем другой конструктор. Попытка этот конструктор Date("yyyy", "mm", "dd")

  • IE: new Date("2008", "04", "02"); =>"Fri May 2 00:00:00 EDT 2008"
  • FF: new Date("2008", "04", "02"); =>"Fri May 2 00:00:00 EDT 2008"
  • IE: new Date("2008", "03", "02"); =>"Wed Apr 2 00:00:00 EDT 2008"
  • FF: new Date("2008", "03", "02"); =>"Wed Apr 2 00:00:00 EDT 2008"

Так конструктор Date("yyyy", "mm", "dd") использует inde x от 0 для представления января.

Кто-нибудь имел дело с этим?
Должен быть лучший способ, чем вычитать 1 из месяцев.

ответ

44

definition of the Date object использовать значения 0-11 для поля month.

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

Кстати, в Firefox,

new Date("04/02/2008"); 

отлично работает для меня - это будет интерпретировать слэш, но не дефис. Я думаю, это доказывает мою точку зрения, что использование String для создания объекта Date является проблемой. Используйте вместо этого явные значения для месяца/дня/года:

new Date(2008, 3, 2); 
1

Вы совершенно правы, месяц указывается как индекс, так что январь месяц число 0 и декабрь месяц номер 11 ...

- и нет работы вокруг, как говорится, ясно в ECMA-скрипта четкостью, хотя простые приемы обычно будут работать:

var myDate = "2008,03,02".split(","); 
var theDate = new Date(myDate[0],myDate[1]-1,myDate[2]); 
alert(theDate); 
17

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

var myDateArray = "2008-03-02".split("-"); 
var theDate = new Date(myDateArray[0],myDateArray[1]-1,myDateArray[2]); 
alert(theDate); 
3

Использование

var theDate = new Date(myDate[0],myDate[1]-1,myDate[2]); 

прекрасно, но это показывает некоторые странное поведение, когда месяц и день значения ошибочны.

Попробуйте ввести дату, в которой оба значения myDate[1]-1 и myDate[2] имеют значения 55. Javascript по-прежнему возвращает дату, хотя вход явно не соответствует действительности.

Я бы предпочел javascript, чтобы вернуть ошибку в таком случае.

2

@Frank: вы правы. Когда вам нужно подтвердить дату,

var theDate = new Date(myDate[0],myDate[1]-1,myDate[2]); 

не будет работать.

Что происходит, так это то, что он продолжает добавлять дополнительный параметр. Например:

new Date("2012", "11", "57") // Date {Sat Jan 26 2013 00:00:00 GMT+0530 (IST)} 

Дата объекта принимает дополнительные дни (57-31 = 26) и добавляет их к дате, которую мы создали.

Или, если мы попытаемся строить объект даты с:

new Date("2012", "11", "57", "57") //Date {Mon Jan 28 2013 09:00:00 GMT+0530 (IST)} 

2 дополнительными дней и 9 часов (24 = 57 + 24 + 9) добавляются.

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