Javascript Date () конструктор не работает - PullRequest
29 голосов
/ 02 октября 2008

У меня есть проблема -

Конструктор 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") использует индекс 0 для представления января.

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

Ответы [ 6 ]

44 голосов
/ 02 октября 2008

Это определение объекта Date для использования значений 0-11 для поля month.

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

Кстати, в Firefox,

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

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

new Date(2008, 3, 2);
18 голосов
/ 13 апреля 2009

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

var myDateArray = "2008-03-02".split("-");
var theDate = new Date(myDateArray[0],myDateArray[1]-1,myDateArray[2]); 
alert(theDate);
3 голосов
/ 05 апреля 2011

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

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

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

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

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

2 голосов
/ 17 июля 2012

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

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)}

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

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

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

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

1 голос
/ 03 октября 2008

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

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

var myDate = "2008,03,02".split(",");
var theDate = new Date(myDate[0],myDate[1]-1,myDate[2]); 
alert(theDate);
0 голосов
/ 02 октября 2008

Жирный текст.

Это может быть вашим интересом: JavaScript Pretty Date .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...