Я ищу самый простой и чистый способ добавить X месяцев к дате JavaScript.
Я бы предпочел не справляться с переносом года или писать свою собственную функцию .
Есть ли что-то встроенное, что может сделать это?
javascript
date
Чад
источник
источник
Ответы:
Следующая функция добавляет месяцы к дате в JavaScript ( источник ). Он учитывает продления года и различную продолжительность месяца:
Вышеупомянутое решение охватывает крайний случай перехода от месяца с большим числом дней, чем месяц назначения. например.
Если при подаче заявки меняется день месяца
setMonth
, мы знаем, что мы переполнились в следующий месяц из-за разницы в продолжительности месяца. В этом случае мы используем,setDate(0)
чтобы вернуться к последнему дню предыдущего месяца.Примечание: эта версия этого ответа заменяет более раннюю версию (ниже), которая не корректно обрабатывает разные месяцы.
источник
addMonths
функция здесь , что уважает конец месяца (например ,2012-01-31 + 1 month = 2012-02-29
и так далее).Я использую библиотеку moment.js для манипуляций с датой и временем . Пример кода для добавления один месяц:
источник
Эта функция обрабатывает крайние случаи и работает быстро:
тест:
Обновление для дат не в формате UTC: (А. Хаткинс)
тест:
источник
Учитывая, что ни один из этих ответов не будет учитывать текущий год, когда меняется месяц, вы можете найти ответ, который я сделал ниже:
Метод:
Использование:
источник
Взяты из ответов @bmpsini и @Jazaret , но не расширяют прототипы: используют простые функции ( почему расширение нативных объектов - плохая практика? ):
Используй это:
источник
Из приведенных выше ответов единственная проблема, которая обрабатывает крайние случаи (bmpasini из библиотеки datejs), имеет проблему:
Да, но:
хуже :
Это происходит из-за того, что время не установлено, и, таким образом, происходит возврат к 00:00:00, который затем может сбиться с предыдущим днем из-за изменения часового пояса или экономии времени или чего-то еще ...
Вот мое предлагаемое решение, в котором нет такой проблемы, и, я думаю, оно более элегантно, поскольку оно не опирается на жестко закодированные значения.
Модуль успешно протестирован с:
источник
Как было отмечено в большинстве ответов, мы можем использовать метод setMonth () вместе с методом getMonth (), чтобы добавить определенное количество месяцев к определенной дате.
Пример: (как упомянуто @ChadD в своем ответе.)
Но мы должны осторожно использовать это решение, так как у нас возникнут проблемы с крайними случаями.
Для обработки крайних случаев полезен ответ, который приведен в следующей ссылке.
https://stackoverflow.com/a/13633692/3668866
источник
Простое решение:
2678400000
31 день в миллисекундахОбновить:
Используйте эти данные для создания нашей собственной функции:
2678400000
- 31 день2592000000
- 30 дней2505600000
- 29 дней2419200000
- 28 днейисточник
Месяцы имеют индекс, основанный на 0, он должен предупреждать (4), который равен 5 (май);
источник
Просто чтобы добавить к принятому ответу и комментариям.
источник
Я написал это альтернативное решение, которое прекрасно работает для меня. Это полезно, когда вы хотите рассчитать окончание контракта. Например, начало = 2016-01-15, месяцы = 6, конец = 2016-7-14 (т. Е. Последний день - 1):
Примеры:
источник
Ниже приведен пример расчета будущей даты на основе ввода даты (membersssignup_date) + добавленных месяцев (membershipsmonths) через поля формы.
Поле membershipsmonths имеет значение по умолчанию 0
Триггерная ссылка (может быть событием onchange, прикрепленным к полю членства):
источник
Как показывают многие из сложных, безобразных ответов, Dates and Times могут стать кошмаром для программистов, использующих любой язык. Мой подход заключается в том, чтобы преобразовать даты и значения 'delta t' в Epoch Time (в мс), выполнить любую арифметику, а затем преобразовать обратно в «человеческое время».
Это было написано для немного другого варианта использования, но вы должны быть в состоянии легко адаптировать его для связанных задач.
РЕДАКТИРОВАТЬ: Полный источник здесь !
источник
Все это кажется слишком сложным, и я предполагаю, что он вступает в дискуссию о том, что именно означает «месяц». Это значит 30 дней? Это означает с 1-го по 1-е? С последнего дня до последнего дня?
Если последнее, то если добавить месяц к 27 февраля, вы получите 27 марта, а если добавить месяц к 28 февраля, то получите 31 марта (кроме високосных лет, когда 28 марта). Затем вычитая месяц с 30 марта, вы получаете ... 27 февраля? Кто знает...
Для тех, кто ищет простое решение, просто добавьте миллисекунды и все готово.
или
источник
d.setMonth(d.getMonth()+1)
? Так что это даже не самая простая идея.источник
Иногда полезно создать дату одним оператором, как в параметрах BIRT
Я сделал 1 месяц назад с:
источник
Как указано выше, вы можете добавить месяц, чтобы
Date
функционировать.источник