Как узнать количество дней между двумя датами в JavaScript? Например, в полях ввода указаны две даты:
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>
<script>
alert(datediff("day", first, second)); // what goes here?
</script>
javascript
date
Майкл Харен
источник
источник
Ответы:
Вот быстрое и грязное внедрение
datediff
, в качестве доказательства концепции для решения проблемы, представленной в вопросе. Он основан на том факте, что вы можете получить прошедшие миллисекунды между двумя датами, вычитая их, что приводит их к значению их примитивного числа (миллисекунды с начала 1970 года).Вы должны знать, что «нормальные» API-интерфейсы Date (без «UTC» в названии) работают в локальном часовом поясе браузера пользователя, поэтому в целом вы можете столкнуться с проблемами, если ваш пользователь находится в часовом поясе, который вы не делаете. ожидайте, и ваш код будет иметь дело с переходами на летнее время. Вам следует внимательно прочитать документацию по объекту Date и его методам, а для чего-то более сложного настоятельно рекомендуем использовать библиотеку, которая предлагает более безопасные и мощные API для манипулирования датами.
Date
- Справочник MDN JavaScriptТакже, в целях иллюстрации, фрагмент использует именованный доступ к
window
объекту для краткости, но в производстве вы должны использовать стандартизированные API, такие как getElementById , или, более вероятно, некоторую инфраструктуру пользовательского интерфейса.источник
parseDate
метод на:return new Date(mdy[2], mdy[1], mdy[0]-1);
На момент написания статьи только один из других ответов правильно обрабатывал переходы DST (летнее время). Вот результаты для системы, расположенной в Калифорнии:
Хотя
Math.round
возвращает правильные результаты, я думаю, что это несколько неуклюже. Вместо этого, явно учитывая изменения в смещении UTC, когда начинается или заканчивается DST, мы можем использовать точную арифметику:объяснение
Вычисление дат в JavaScript сложно, потому что
Date
объекты хранят время внутри UTC, а не по местному времени. Например, 3/10/2013 12:00 по тихоокеанскому стандартному времени (UTC-08: 00) хранится как 3/10/2013 8:00 по UTC и 11.03.2013 в 12:00 по тихоокеанскому летнему времени ( UTC-07: 00) хранится как 11.03.2013 7:00 UTC. В этот день с полуночи до полуночи по местному времени в UTC только 23 часа!Хотя день по местному времени может иметь больше или меньше 24 часов, день в UTC всегда ровно 24 часа. 1
daysBetween
способ , показанный выше , использует этот факт первого вызова ,treatAsUTC
чтобы настроить как местное время до полуночи UTC до вычитания и деления.1. JavaScript игнорирует дополнительные секунды.
источник
Date.UTC(...)
в первую очередь.Самый простой способ получить разницу между двумя датами:
Вы получаете разницу дней (или NaN, если один или оба не могут быть проанализированы). Дата разбора дала результат в миллисекундах, и чтобы получить его по дням, нужно разделить его на 24 * 60 * 60 * 1000
Если вы хотите, чтобы оно делилось на дни, часы, минуты, секунды и миллисекунды:
Вот моя переработанная версия Джеймса:
источник
Я рекомендую использовать библиотеку moment.js ( http://momentjs.com/docs/#/displaying/difference/ ). Он правильно обрабатывает переход на летнее время и в целом с ним приятно работать.
Пример:
источник
end.diff(start,"days")
хотя написанный код будет работать, потому что дата начала после даты окончания!Я бы взял эту маленькую утилиту, и в ней вы найдете функции для этого. Вот короткий пример:
источник
Обновление: я знаю, что это не является частью ваших вопросов, но в целом я бы не рекомендовал делать какие-либо вычисления или манипуляции с датами в vanilla JavaScript, а использовать для этого библиотеку типа date-fns или moment.js из-за множества крайних случаев.
источник
timeDiff
вернулся в минус? Не должноtimeDiff
быть(new Date(endDate)) - (new Date(startDate));
?(new Date('2017-11-08')) - (new Date('2017-10-01')) // 3283200000
const timeDiff = +(new Date(start)) - +(new Date(end));
return (Date.UTC(yr2, mo2-1, dy2) - Date.UTC(yr1, mo1-1, dy1)) / 86400000;
Использование Moment.js
источник
var now = moment(), yearStart = moment().startOf('year'); var ytdDays = now.diff(yearStart, 'days'); // this can be years, months, weeks, days, hours, minutes, and seconds console.log(ytdDays);
здесь: momentjs.comЗначения даты в JS являются значениями даты и времени.
Таким образом, прямые вычисления даты противоречивы:
например нам нужно конвертировать 2-ую дату:
метод можно обрезать мельницы в обе даты:
источник
Лучше избавиться от DST, Math.ceil, Math.floor и т. Д., Используя время UTC:
Этот пример дает разницу 109 дней.
24*60*60*1000
один день в миллисекундах.источник
Чтобы рассчитать дни между 2 указанными датами, вы можете использовать следующий код. Даты, которые я здесь использую: 01 января 2016 г. и 31 декабря 2016 г.
источник
Можно рассчитать полную разность дней доказательств между двумя датами, расположенными в разных TZ, используя следующую формулу:
источник
Я нашел этот вопрос, когда хочу вычислить две даты, но дата имеет значение часов и минут, я изменил ответ @ michael-liu, чтобы он соответствовал моим требованиям, и он прошел мой тест.
разность дней
2012-12-31 23:00
и2013-01-01 01:00
должна быть равна 1. (2 часа) разность дней2012-12-31 01:00
и2013-01-01 23:00
должна быть равна 1. (46 часов)источник
пример jsfiddle :)
источник
Я думаю, что решения не верны 100% Я бы использовал Ceil вместо пола , Round будет работать, но это не правильная операция.
источник
Как насчет использования formatDate из виджета DatePicker? Вы можете использовать его для преобразования дат в формат отметки времени (миллисекунды с 01.01.1970), а затем выполнить простое вычитание.
источник
источник
Возможно, это не самое элегантное решение, но, кажется, оно отвечает на вопрос относительно простым кусочком кода. Разве вы не можете использовать что-то вроде этого:
Предполагается, что вы передаете объекты даты в качестве параметров.
источник
Если у вас есть две временные метки Unix, вы можете использовать эту функцию (для большей ясности сделана более подробной):
Пример:
источник
Будьте осторожны при использовании миллисекунд .
Date.getTime () возвращает миллисекунды и делает математическую операцию с миллисекунд требуется включить
Пример из комментария выше - лучшее решение, которое я нашел до сих пор https://stackoverflow.com/a/11252167/2091095 . Но используйте +1 к его результату, если вы хотите, чтобы считать все вовлеченные дни.
источник
источник
У меня была такая же проблема в Angular. Я делаю копию, потому что иначе он перезапишет первое свидание. Обе даты должны иметь время 00:00:00 (очевидно)
источник
Я использовал приведенный ниже код, чтобы поэкспериментировать с функциональностью даты публикации для публикации новостей. Я рассчитываю минуту, час, день или год на основе даты публикации и текущей даты.
источник
Если вы хотите иметь DateArray с датами, попробуйте это:
DebugSnippet
источник
Простой способ подсчета дней между двумя датами состоит в том, чтобы удалить оба компонента времени, т. Е. Установить часы, минуты, секунды и миллисекунды в 0, а затем вычесть их время и погрузить его с миллисекундами в один день.
источник
new Date
источник
Простой, легкий и сложный. Эта функция будет вызываться каждые 1 секунду для обновления времени.
источник
Лучшее решение от
он вернет 0, если обе даты совпадают.
источник
Вклад на дату до 1970-01-01 и после 2038-01-19
источник
источник
Вы можете использовать UnderscoreJS для форматирования и расчета разницы.
Демо https://jsfiddle.net/sumitridhal/8sv94msp/
источник