Js сколько дней между датами
Перейти к содержимому

Js сколько дней между датами

  • автор:

Каким образом посчитать разность дат в JS?

Всем привет,
Имеется простая таблица с графами Дата начала работ и Запланированная дата сдачи
Данные вводятся в модальном окне.
Дата начала работ имеет input date.
Запланированная дата сдачи имеет input number.
В базе данных mold_start_date и mold_scheduled_date имеют тип date.
В модальном окне собираются данные формы и отправляются в БД по принципу:

Теперь эти данные нужно изменить, опять же в модальном окне и отправить на сервер используя UPDATE вместо INSERT.

Данные в модальное окно подставляются с помощью JS

Все данные отлично добавляются, но не изменяются, потому что прежде чем выводить в модальное окно, данные дату нужно снова посчитать, но в обратном порядке: Запланированная дата сдачи — Дата начала работ и вывести уже число. Каким образом посчитать в разницу в датах в JS и подставить в модальное окно?

Дата и время

Встречайте новый встроенный объект: Date. Он содержит дату и время, а также предоставляет методы управления ими.

Например, его можно использовать для хранения времени создания/изменения, для измерения времени или просто для вывода текущей даты.

Создание

Для создания нового объекта Date нужно вызвать конструктор new Date() с одним из следующих аргументов:

Без аргументов – создать объект Date с текущими датой и временем:

Создать объект Date с временем, равным количеству миллисекунд (тысячная доля секунды), прошедших с 1 января 1970 года UTC+0.

Целое число, представляющее собой количество миллисекунд, прошедших с начала 1970 года, называется таймстамп (англ. timestamp).

Это – легковесное численное представление даты. Из таймстампа всегда можно получить дату с помощью new Date(timestamp) и преобразовать существующий объект Date в таймстамп, используя метод date.getTime() (см. ниже).

Датам до 1 января 1970 будут соответствовать отрицательные таймстампы, например:

Если аргумент всего один, и это строка, то из неё «прочитывается» дата. Алгоритм разбора – такой же, как в Date.parse , который мы рассмотрим позже.

Создать объект Date с заданными компонентами в местном часовом поясе. Обязательны только первые два аргумента.

  • year должен состоять из четырёх цифр. Для совместимости также принимаются 2 цифры и рассматриваются как 19xx , к примеру, 98 здесь это тоже самое, что и 1998 , но настоятельно рекомендуется всегда использовать 4 цифры.
  • month начинается с 0 (январь) по 11 (декабрь).
  • Параметр date здесь представляет собой день месяца. Если параметр не задан, то принимается значение 1 .
  • Если параметры hours/minutes/seconds/ms отсутствуют, их значением становится 0 .

Максимальная точность – 1 мс (до 1/1000 секунды):

Получение компонентов даты

Существуют методы получения года, месяца и т.д. из объекта Date :

getFullYear() Получить год (4 цифры) getMonth() Получить месяц, от 0 до 11. getDate() Получить день месяца, от 1 до 31, что несколько противоречит названию метода. getHours(), getMinutes(), getSeconds(), getMilliseconds() Получить, соответственно, часы, минуты, секунды или миллисекунды.

Многие интерпретаторы JavaScript реализуют нестандартный и устаревший метод getYear() , который порой возвращает год в виде двух цифр. Пожалуйста, обходите его стороной. Если нужно значение года, используйте getFullYear() .

Кроме того, можно получить определённый день недели:

getDay() Вернуть день недели от 0 (воскресенье) до 6 (суббота). Несмотря на то, что в ряде стран за первый день недели принят понедельник, в JavaScript начало недели приходится на воскресенье.

Все вышеперечисленные методы возвращают значения в соответствии с местным часовым поясом.

Однако существуют и их UTC-варианты, возвращающие день, месяц, год для временной зоны UTC+0: getUTCFullYear(), getUTCMonth(), getUTCDay(). Для их использования требуется после "get" подставить "UTC" .

Если ваш местный часовой пояс смещён относительно UTC, то следующий код покажет разные часы:

Помимо вышеприведённых методов, существуют два особых метода без UTC-варианта:

Для заданной даты возвращает таймстамп – количество миллисекунд, прошедших с 1 января 1970 года UTC+0.

Возвращает разницу в минутах между UTC и местным часовым поясом:

Установка компонентов даты

Следующие методы позволяют установить компоненты даты и времени:

У всех этих методов, кроме setTime() , есть UTC-вариант, например: setUTCHours() .

Как мы видим, некоторые методы могут устанавливать сразу несколько компонентов даты, например: setHours . Если какая-то компонента не указана, она не меняется.

Автоисправление даты

Автоисправление – это очень полезная особенность объектов Date . Можно устанавливать компоненты даты вне обычного диапазона значений, а объект сам себя исправит.

Неправильные компоненты даты автоматически распределяются по остальным.

Предположим, нам требуется увеличить дату «28 февраля 2016» на два дня. В зависимости от того, високосный это год или нет, результатом будет «2 марта» или «1 марта». Нам об этом думать не нужно. Просто прибавляем два дня. Объект Date позаботится об остальном:

Эту возможность часто используют, чтобы получить дату по прошествии заданного отрезка времени. Например, получим дату «спустя 70 секунд с текущего момента»:

Также можно установить нулевые или даже отрицательные значения. Например:

Преобразование к числу, разность дат

Если объект Date преобразовать в число, то получим таймстамп по аналогии с date.getTime() :

Важный побочный эффект: даты можно вычитать, в результате получаем разность в миллисекундах.

Этот приём можно использовать для измерения времени:

Date.now()

Если нужно просто измерить время, объект Date нам не нужен.

Существует особый метод Date.now() , возвращающий текущую метку времени.

Семантически он эквивалентен new Date().getTime() , однако метод не создаёт промежуточный объект Date . Так что этот способ работает быстрее и не нагружает сборщик мусора.

Данный метод используется из соображений удобства или когда важно быстродействие, например, при разработке игр на JavaScript или других специализированных приложений.

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

Бенчмаркинг

Будьте внимательны, если хотите точно протестировать производительность функции, которая зависит от процессора.

Например, сравним две функции, вычисляющие разницу между двумя датами: какая сработает быстрее?

Подобные вычисления, замеряющие производительность, также называют «бенчмарками» (benchmark).

Обе функции делают буквально одно и то же, только одна использует явный метод date.getTime() для получения даты в миллисекундах, а другая полагается на преобразование даты в число. Результат их работы всегда один и тот же.

Но какая функция быстрее?

Для начала можно запустить их много раз подряд и засечь разницу. В нашем случае функции очень простые, так что потребуется хотя бы 100000 повторений.

Вот это да! Метод getTime() работает ощутимо быстрее! Всё потому, что не производится преобразование типов, и интерпретаторам такое намного легче оптимизировать.

Замечательно, это уже что-то. Но до хорошего бенчмарка нам ещё далеко.

Представьте, что при выполнении bench(diffSubtract) процессор параллельно делал что-то ещё, также потребляющее ресурсы. А к началу выполнения bench(diffGetTime) он это уже завершил.

Достаточно реалистичный сценарий в современных многопроцессорных операционных системах.

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

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

Современные интерпретаторы JavaScript начинают применять продвинутые оптимизации только к «горячему коду», выполняющемуся несколько раз (незачем оптимизировать то, что редко выполняется). Так что в примере выше первые запуски не оптимизированы должным образом. Нелишним будет добавить предварительный запуск для «разогрева»:

Современные интерпретаторы JavaScript выполняют множество оптимизаций. Они могут повлиять на результаты «искусственных тестов» по сравнению с «нормальным использованием», особенно если мы тестируем что-то очень маленькое, например, работу оператора или встроенной функции. Поэтому если хотите серьёзно понять производительность, пожалуйста, изучите, как работают интерпретаторы JavaScript. И тогда вам, вероятно, уже не понадобятся микробенчмарки.

Отличный набор статей о V8 можно найти на https://mrale.ph.

Разбор строки с датой

Метод Date.parse(str) считывает дату из строки.

Формат строки должен быть следующим: YYYY-MM-DDTHH:mm:ss.sssZ , где:

  • YYYY-MM-DD – это дата: год-месяц-день.
  • Символ "T" используется в качестве разделителя.
  • HH:mm:ss.sss – время: часы, минуты, секунды и миллисекунды.
  • Необязательная часть ‘Z’ обозначает часовой пояс в формате +-hh:mm . Если указать просто букву Z , то получим UTC+0.

Возможны и более короткие варианты, например, YYYY-MM-DD или YYYY-MM , или даже YYYY .

Как узнать количество дней между двумя датами в JavaScript?

Как получить количество дней между двумя датами в JavaScript? Например, учитывая две даты в поле ввода:

37 ответов

Вот быстрая и грязная реализация datediff , как доказательство концепции для решения проблемы, представленной в вопросе. Он полагается на то, что вы можете получить истекшие миллисекунды между двумя датами, вычитая их, что приводит их к их первообразному значению числа (миллисекунды с начала 1970 года).

Вы должны знать, что «обычные» API-интерфейсы даты (без «UTC» в имени) работают в локальном часовом поясе пользовательского браузера, поэтому, в общем, вы можете столкнуться с проблемами, если ваш пользователь находится в часовом поясе, ожидайте, и ваш код будет иметь дело с переходами на летнее время. Вы должны внимательно прочитать документацию для объекта Date и его методов, а для чего-то более сложного, настоятельно рекомендуем использовать библиотеку, которая предлагает более безопасные и мощные API для обработки дат.

  • Номера и даты — Руководство по JavaScript MDN
  • Date — ссылка MDN JavaScript

Кроме того, для иллюстративных целей фрагмент использует кратность для именованного доступа к объекту window , но в процессе производства вы должны использовать стандартизированные API, такие как getElementById или, более вероятно, некоторые интерфейсы пользовательского интерфейса.

На момент написания этой статьи, только один из других ответов правильно обрабатывает переходы DST (переход на летнее время). Вот результаты по системе, расположенной в Калифорнии:

Хотя Math.round возвращает правильные результаты, я думаю, что он несколько неуклюж. Вместо этого, явно учитывая изменения смещения UTC, когда DST начинается или заканчивается, мы можем использовать точную арифметику:

Описание

Расчеты с датой в JavaScript сложны, потому что Date объекты хранятся внутри внутри UTC, а не по местному времени. Например, 3/10/2013 12:00 AM Тихоокеанское стандартное время (UTC-08: 00) хранится как 3/10/2013 8:00 AM UTC и 3/11/2013 12:00 AM Pacific Daylight Time ( UTC-07: 00) хранится как 3/11/2013 7:00 UTC. В этот день полночь в полночь по местному времени составляет только 23 часа в UTC!

Хотя день в местное время может быть больше или меньше 24 часов, день в UTC всегда ровно 24 часа. 1 . Метод daysBetween , показанный выше, использует этот факт, сначала вызывая treatAsUTC , чтобы настроить оба локальных раза до полуночи UTC, прежде чем вычитать и делить.

Rukovodstvo

статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.

JavaScript: узнать количество дней между датами

Введение Мы часто подсчитываем количество дней от и до свидания. Будь то вычисление того, когда кто-то должен вернуть книгу, когда нужно продлить подписку, сколько дней прошло с момента уведомления или когда приближается новое событие. В этом руководстве мы рассмотрим, как получить количество дней между датами в JavaScript. Объект даты в JavaScript. Дата в JavaScript — это количество тактов (или миллисекунд), прошедших с начала

Время чтения: 3 мин.

Вступление

Мы часто оказываемся подсчета количества дней от и до настоящего времени. Будь то вычисление того, когда кто-то должен вернуть книгу, когда нужно продлить подписку, сколько дней прошло с момента уведомления или когда приближается новое событие.

В этом руководстве мы рассмотрим, как получить количество дней между датами в JavaScript .

Объект Date в JavaScript

Date JavaScript — это Number тактов (или миллисекунд), прошедших с начала эпохи UNIX (полночь 1 января 1970 г. по всемирному координированному времени).

Несмотря на то, что, по сути, Date определяется в терминах UTC , все его методы получают время и даты в местном часовом поясе:

Теперь, когда мы знакомы с синтаксисом, давайте посмотрим, как получить количество дней между двумя датами с помощью Date в JavaScript.

Количество дней между датами

Чтобы получить количество дней между двумя датами, мы getNumberOfDays() , которая принимает два объекта Date

Этот код приводит к:

Функция принимает две String , представляющие даты. Сначала мы создаем Date из этих строк, после чего вычисляем количество миллисекунд в день. Функция getTime() возвращает время в миллисекундах между началом эпохи Unix и текущим временем. Итак, если мы вычтем дату start end , мы получим количество миллисекунд между ними.

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

Примечание. Этот подход включает start , но исключает дату end

Получите количество дней между датами в JavaScript с помощью js-joda

Разработчики, знакомые с Java, вероятно, будут знакомы с широко используемой библиотекой Joda-Time , которая была чрезвычайно популярна до обновления Java 8 API даты / времени.

Влияние Joda-Time вдохновило на создание js-joda — универсальной библиотеки даты / времени для JavaScript, основанной на календарной системе ISO.

Дополнительным преимуществом является то, что он чрезвычайно легкий и очень быстрый, и по сравнению с другими библиотеками, такими как Moment.js или date-utils , он предоставляет собственную реализацию объектов даты / времени вместо того, чтобы полагаться на Date из собственной реализации JavaScript. .

Давайте импортируем библиотеку через ванильный JavaScript:

Или, если вы используете NPM:

Теперь мы можем использовать js-joda API. Давайте перепишем предыдущую функцию, чтобы использовать LocalDate , любезно предоставленный js-joda :

Это также приводит к:

Примечание: этот подход также исключает end_date .

Заключение

В этом руководстве мы рассмотрели, как получить количество дней между датами в JavaScript. Помимо встроенного подхода, основанного на Date , мы также исследовали js-joda , которая была вдохновлена библиотекой Joda-Time , управляемой Java, для гораздо более лаконичного подхода к решению этой проблемы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *