2011-12-23 5 views
2

Дата объекты, экземпляры, как это:javascript Date почему Date new Date («2011-12-13») считается понедельником, а не во вторник?

new Date("2011-12-13") 

возвращает объект даты, которые считают себя понедельник:

Date {Mon Dec 12 2011 16:00:00 GMT-0800 (PST)} 

Но по моему календарю, 12/13/2011 является вторник. Как ни странно, когда я создаю экземпляр объекта даты, как это:

new Date("12/13/2011") 

Это (правильно) возвращает Вторник:

Date {Tue Dec 13 2011 00:00:00 GMT-0800 (PST)} 

Как я могу использовать синтаксис в моем исходном примере (год-месяц-день) а также получить правильный день недели в соответствии с моим календарем?

ответ

7

Возможно, вы захотите проверить https://stackoverflow.com/a/163584/436641 на некоторые оговорки о создании объектов Date в JavaScript с использованием строк. В двух словах, для надежности, вы должны делать это:

new Date(2011, 11, 13); 

(Обратите внимание, что второй параметр, месяц, составляет 0 за январь 11 за декабрь, а не 1-го по 12)

В ваш конкретный случай, когда вы создаете экземпляр с помощью "2011-12-13", он использует GMT, а затем настраивается на ваш часовой пояс, который в вашем случае на восемь часов меньше GMT. Таким образом, вы получаете 4 часа дня за день до того, как задаетесь вопросом. Так что это понедельник, а не вторник. (См. Результат, где говорится, что время 16:00:00, а дата 12-го, а не 13-го?)

Когда вы создаете экземпляр с "12/13/2011", вы получаете полночь на 13-м месте в своем местном часовом поясе. Итак, вы получаете вторник, в тот день, когда вы просили.

Разница (возможно) объясняется тем, что Date будет передать строку в статическое parse() метод, который (возможно) обработка одного из этих строк в качестве ISO 8601 метки времени, а другой в качестве RFC-822 метки времени, и что значения по умолчанию/наилучшие догадки для часовых поясов для этих временных меток отличаются. См. https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/parse для ситуации с Firefox. Другие браузеры могут быть или не совпадать. Поэтому лучше не использовать строки (и если вы используете строки, используйте длинные однозначные стандартные временные метки, а не усеченные).

+0

Я добавил вероятную причину в качестве последнего абзаца к моему ответу. В принципе, 'Date.parse()' должен угадывать, что предполагается, когда он получает усеченную строку timestamp, поэтому он делает предположение относительно того, что, по его мнению, вероятно, предназначен для часовой пояс. – Trott

+0

Стоит отметить, что если вы добавите в строку '00: 00: 00', вы получите результаты, которые вы ищете. В моем случае проще просто разбираться со строкой, а не разбирать детали даты (и вычитать 1 за месяц). –

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