Установка даты UTC, кажется, использует летнее время

Когда я пытаюсь добавить месяцы моей даты, он пропускает ноябрь. Я считаю, что это из-за перехода на летнее время в ноябре.

Вот код, который показывает, что он перепрыгнул на один день дальше, чем мне нужно:

var my_date = new Date(1377993599000);
console.log(my_date.toUTCString());

Это выводит «Сб, 31 августа 2013 г., 23:59:59 по Гринвичу».

my_date.setUTCMonth(my_date.getUTCMonth() + 3);
console.log(my_date.toUTCString());

Это выводит «Вс, 01 декабря 2013 г., 23:59:59 по Гринвичу».

И теперь, когда я пытаюсь добавить только 2:

my_date.setUTCMonth(my_date.getUTCMonth() + 2);
console.log(my_date.toUTCString());

Это выводит «Чт, 31 октября 2013 г., 23:59:59 по Гринвичу».

Когда я пытаюсь установить дату на ноль:

my_date.setUTCMonth(my_date.getUTCMonth() + 3, 0);
console.log(my_date.toUTCString());

Это выводит «Чт, 31 октября 2013 г., 23:59:59 по Гринвичу».

Кто-нибудь знает чистый трюк для исправления этого?

Мне лучше отказаться от функций UTC и просто удалить смещение часового пояса из всех времен? Если бы я сделал это, это действительно решило бы мою проблему?


person eli    schedule 01.08.2013    source источник


Ответы (2)


31 ноября нет, поэтому, когда вы добавляете 3 месяца к месяцам, у него нет другого выбора, кроме как перейти к следующему месяцу, что делает его 1 декабря.

Проблема надежного продвижения вперед по месяцам сложна. Вы можете установить день месяца (.setDate()) равным 1, прежде чем делать это, но тогда вам нужно решить, как установить его обратно на что-то, относящееся к исходной дате.

person Pointy    schedule 01.08.2013
comment
Опередил меня, собирался включить кое-что о получении последнего дня месяца (установка даты месяца после 0) - person Paul S.; 02.08.2013
comment
Ты сделал это. И способ сделать это: my_date.setUTCMonth(end_date.getUTCMonth() + 4, 0); - person eli; 02.08.2013
comment
@eli - вы хотите установить дату на ноль только там, где вы перешли на следующий месяц, поэтому обычно вы не можете этого делать. - person RobG; 02.08.2013

Ответ Pointy правильный, вот функция, учитывающая нечетные месяцы:

/* Given a date object, add months (may be +ve or -ve)
** Allow for uneven length months, e.g.
**
**   30 Jan 2013 + 1 month => 30 Feb => 2 Mar
**
** so make 28 Feb. Also works for subtraction
**/
function addMonths(date, months){
  // Copy date, avoid IE bug for early dates
  var d = new Date(date.getTime());
  months = Number(months);
  d.setMonth(d.getMonth() + months);
  var check = d.getMonth() - date.getMonth() + months;

  // If rolled over to next month, go to last day of previous month
  if (check) {
    d.setDate(0); 
  }
  return d;
}
person RobG    schedule 01.08.2013