Как бы я вычислил разницу для двух объектов Date () в JavaScript, при этом возвращая только количество месяцев в разнице?
Любая помощь будет отличной :)
javascript
date
datediff
williamtroup
источник
источник
Ответы:
Определение «количество месяцев в разнице» подлежит большой интерпретации. :-)
Вы можете получить год, месяц и день месяца из объекта даты JavaScript. В зависимости от того, какую информацию вы ищете, вы можете использовать ее, чтобы выяснить, сколько месяцев проходит между двумя моментами времени.
Например, из-под контроля:
Показать фрагмент кода
(Обратите внимание, что значения месяца в JavaScript начинаются с 0 = января.)
Включение дробных месяцев в вышеприведенное намного сложнее, потому что три дня в типичном феврале - это большая доля этого месяца (~ 10,714%), чем три дня в августе (~ 9,677%), и, конечно, даже февраль является движущейся целью в зависимости от того, високосный ли это год.
Есть также некоторые библиотеки даты и времени, доступные для JavaScript, которые, вероятно, облегчают подобные вещи.
Примечание . Раньше
+ 1
здесь было:Это потому, что изначально я сказал:
Я удалил его по двум причинам:
Не считая неполных месяцев, оказывается, не то, что хотят многие (большинство?) Люди, приходящие к ответу, поэтому я подумал, что должен их выделить.
Это не всегда работало даже по этому определению. :-D (Извините.)
источник
Если вы не учитываете день месяца, это гораздо более простое решение.
Помните, что индекс месяца основан на 0. Это значит что
January = 0
иDecember = 11
.источник
Иногда вы можете захотеть получить только количество месяцев между двумя датами, полностью игнорируя часть дня. Так, например, если у вас было две даты - 2013/06/21 и 2013/10/18 - и вы заботились только о частях 2013/06 и 2013/10, вот сценарии и возможные решения:
1.Если вы хотите указать количество месяцев между двумя датами, исключая месяц1 и месяц2
2. Если вы хотите включить один из месяцев
3. Если вы хотите включить оба месяца
источник
numberOfMonths=(year2-year1)*12+(month2-month1)+1;
что делает то же самое, но более семантически правильно для меняВот функция, которая точно обеспечивает количество месяцев между двумя датами.
Поведение по умолчанию учитывает только целые месяцы, например, 3 месяца и 1 день приведет к разнице в 3 месяца. Вы можете предотвратить это, установив
roundUpFractionalMonths
параметр какtrue
, так что разница в 3 месяца и 1 день будет возвращена как 4 месяца.Принятый ответ выше (ответ TJ Crowder) не точен, иногда он возвращает неправильные значения.
Например,
monthDiff(new Date('Jul 01, 2015'), new Date('Aug 05, 2015'))
возвращает,0
что, очевидно, неправильно. Правильная разница - 1 целый месяц или 2 месяца с округлением.Вот функция, которую я написал:
источник
Если вам нужно сосчитать полные месяцы, независимо от того, был ли месяц 28, 29, 30 или 31 день. Ниже должно работать.
Это расширенная версия ответа https://stackoverflow.com/a/4312956/1987208, но исправляет случай, в котором он рассчитывает 1 месяц для случая с 31 января по 1 февраля (1 день).
Это будет охватывать следующее;
источник
Разница в месяцах между двумя датами в JavaScript:
общее количество месяцев между датой start_date и end_date:
источник
Я знаю, что уже поздно, но в любом случае опубликовать его на тот случай, если это поможет другим. Вот функция, которую я придумал, которая, кажется, хорошо справляется с подсчетом различий в месяцах между двумя датами. По общему признанию, он намного более грубый, чем у мистера Краудера, но дает более точные результаты, проходя через объект даты. Это в AS3, но вы должны просто отказаться от строгой типизации, и у вас будет JS. Не стесняйтесь, чтобы было лучше, когда вы там кого-то ищите!
источник
Чтобы расширить ответ @ TJ, если вы ищете простые месяцы, а не полные календарные месяцы, вы можете просто проверить, является ли дата d2 больше или равна дате d1. То есть, если d2 позже в своем месяце, чем d1 в своем месяце, то существует еще 1 месяц. Так что вы должны просто сделать это:
Это не полностью учитывает временные проблемы (например, 3 марта в 16:00 и 3 апреля в 15:00), но это более точно и всего пара строк кода.
источник
Рассмотрите каждую дату в месяцах, затем вычтите, чтобы найти разницу.
Это даст вам разницу месяцев между двумя датами, игнорируя дни.
источник
Есть два подхода: математический и быстрый, но подверженный капризам в календаре, или итеративный и медленный, но он обрабатывает все странности (или, по крайней мере, делегаты обрабатывают их в хорошо проверенной библиотеке).
Если вы выполняете итерацию по календарю, увеличиваете дату начала на один месяц и смотрите, пропустим ли мы дату окончания. Это делегирует обработку аномалий встроенным классам Date (), но может быть медленным, если вы делаете это для большого числа дат. Джеймс ответ принимает такой подход. Как бы мне не нравилась идея, я думаю, что это «самый безопасный» подход, и если вы только делаете один расчет, разница в производительности действительно незначительна. Мы стремимся чрезмерно оптимизировать задачи, которые будут выполняться только один раз.
Теперь, если вы вычисляете эту функцию на наборе данных, вы, вероятно, не хотите запускать эту функцию в каждой строке (или, не дай бог, несколько раз для каждой записи). В этом случае вы можете использовать почти любые другие ответы здесь, кроме принятого ответа, который является просто неправильным (разница между
new Date()
иnew Date()
равна -1)?Вот мой пример математического и быстрого подхода, который учитывает разную продолжительность месяца и високосного года. Вы действительно должны использовать функцию, подобную этой, только если вы будете применять ее к набору данных (делать это снова и снова). Если вам просто нужно сделать это один раз, используйте итеративный подход Джеймса выше, поскольку вы делегируете обработку всех (многих) исключений для объекта Date ().
источник
Вот вам другой подход с меньшим циклом:
источник
Вы также можете рассмотреть это решение, оно
function
возвращает разницу в месяце в целых числах или числахПередача даты начала как первой или последней
param
, является отказоустойчивой. Это означает, что функция все равно будет возвращать то же значение.источник
Рассчитайте разницу между двумя датами с учетом доли месяца (дней).
источник
Это должно работать нормально:
источник
источник
Следующий код возвращает полные месяцы между двумя датами, учитывая также количество дней неполных месяцев.
источник
}
источник
ниже логика будет получать разницу в месяцах
источник
источник
Посмотрите, что я использую:
источник
источник
Количество месяцев, когда день и время не имеют значения
В этом случае меня не интересуют полные месяцы, неполные месяцы, продолжительность месяца и т. Д. Мне просто нужно знать количество месяцев. Уместным примером из реальной жизни было бы то, когда отчет должен выходить каждый месяц, и мне нужно знать, сколько отчетов должно быть.
Пример:
Это подробный пример кода, показывающий, куда идут цифры.
Давайте возьмем 2 отметки времени, которые должны получиться через 4 месяца
Может немного отличаться в зависимости от вашего часового пояса. День, минуты и секунды не имеют значения и могут быть включены в метку времени, но мы не будем учитывать это при нашем реальном расчете.
Шаг 1: преобразовать метку времени в дату JavaScript
Шаг 2: получить целочисленные значения для месяцев / лет
Это дает нам
Шаг 3: Добавить
(12 * (endYear - startYear)) + 1
в последний месяц.2 + (12 * (2020 - 2019)) + 1 = 15
Шаг 4: Вычтите месяцы
15 - 11 = 4
; мы получаем наш результат за 4 месяца.Пример 29 месяцев Пример
С ноября 2019 года по март 2022 года - 29 месяцев. Если вы поместите их в таблицу Excel, вы увидите 29 строк.
3 + (12 * (2022-2019)) + 1
40 - 11 = 29
источник
источник
Один из подходов - написать простую веб-службу Java (REST / JSON), использующую библиотеку JODA.
http://joda-time.sourceforge.net/faq.html#datediff
рассчитать разницу между двумя датами и вызвать эту услугу из JavaScript.
Это предполагает, что ваш бэкэнд находится на Java.
источник