Новая дата(), установленная до 31 декабря 2014 года, вместо 1 декабря

Я пытаюсь преобразовать строку в объект Date, и она работает в течение всех дней, кроме 31 декабря, где по объекту говорит 1 декабря вместо 31-го. Понятия не имею почему. Вот мой код JavaScript:

var dt = new Date();
dt.setDate("31");
dt.setMonth("11");
dt.setFullYear("2014");

но мое значение переменной:

Mon Dec 01 2014 11:48:08 GMT+0100 (Paris, Madrid)

Если я делаю то же самое для любой другой даты, мой объект возвращается к соответствующему значению. Вы знаете, что я сделал неправильно?

Ответ 1

setMonth должен перед setDate: (небезопасно для месяцев менее 31 дня)

var dt = new Date();
dt.setFullYear(2014);
dt.setMonth(11);
dt.setDate(31);

И setMonth второй параметр также может использоваться для установки даты.

var dt = new Date();
dt.setFullYear(2014);
dt.setMonth(11, 31);


Если аргументы для конструктора отсутствуют, он будет использовать текущую дату и время в соответствии с системными настройками.

Таким образом, использование setMonth и setDate по отдельности все равно вызовет неожиданный результат.

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

Например, если сегодня 2014-09-30, то

var dt = new Date();
dt.setFullYear(2014); /* Sep 30 2014 */
dt.setMonth(1);       /* Mar 02 2014, see, here the auto adjustment occurs! */
dt.setDate(28);       /* Mar 28 2014 */

Чтобы этого избежать, установите значения непосредственно с помощью конструктора.

var dt = new Date(2014, 11, 31);

Ответ 2

Дело в том, что когда вы устанавливаете день первым, вы все еще находитесь в текущем месяце и в сентябре. Сентябрь имеет только 30 дней, поэтому:

var dt = new Date(); /* today */
dt.setDate("31"); /* 1st Oct 2014 as should be by spec */
dt.setMonth("11"); /* 1st Dec 2014 */
dt.setFullYear("2014"); /* 1st Dec 2014 */

Ответ 3

Это потому, что первое, что вы делаете, это

dt.setDate(31)

Это устанавливает текущую дату в 31. Текущий месяц - сентябрь, который имеет 30 дней, поэтому он завершает его.

Если вы должны были распечатать дату после этого момента, это скажет 1 октября.

Ответ 4

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

новая дата (год, месяц, день, час, минута, секунда, миллисекунда)

[...]

Если задано не менее двух аргументов, отсутствующие аргументы установлен на 1 (если день отсутствует) или 0 для всех остальных.

Итак, вы должны написать:

var dt = new Date(2014, 11, 31);

Как уже установлено, установка одной части даты одновременно может привести к переполнению:

var dt = new Date(2012, 1, 29); // Feb 29 2012
dt.setFullYear(2014);           // Mar 01 2014 instead of Feb 28 2014

Кроме того, установка месяца до даты все еще может вызвать непредвиденное переполнение (ответы, рекомендующие изменить порядок методов, неверны):

var dt = new Date(2014, 0, 31); // Jan 31 2014
dt.setFullYear(2014);           // Jan 31 2014
dt.setMonth(1);                 // Mar 03 2014 instead of Feb 28 2014
dt.setDate(1);                  // Mar 01 2014

Ответ 5

Почему поведение и как его избежать объяснено.

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

Ответ 6

В ответах выяснилось, что правильный порядок установки даты:

  • setFullYear()
  • setMonth()
  • SETDATE()

Я просто хочу отметить, что также важно установить год сначала, из-за 29. февраля в leapyears.

Ответ 7

var dt = new Date();
dt.setFullYear(2014);
dt.setMonth(11);
dt.setDate(31);

Передайте значение как целое, а не строку.. оно вернет u правильное значение.


Обновить - выше описание не является правильным.. Основная проблема была вам нужно поставить эти три строки в правильной последовательности.. Даже после того, как я исправил последовательность, я забыл исправить описание..: P