Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
JavaScript: узнать количество дней между датами
Введение Мы часто подсчитываем количество дней от и до свидания. Будь то вычисление того, когда кто-то должен вернуть книгу, когда нужно продлить подписку, сколько дней прошло с момента уведомления или когда приближается новое событие. В этом руководстве мы рассмотрим, как получить количество дней между датами в JavaScript. Объект даты в JavaScript. Дата в JavaScript — это количество тактов (или миллисекунд), прошедших с начала
Время чтения: 3 мин.
Вступление
Мы часто оказываемся подсчета количества дней от и до настоящего времени. Будь то вычисление того, когда кто-то должен вернуть книгу, когда нужно продлить подписку, сколько дней прошло с момента уведомления или когда приближается новое событие.
В этом руководстве мы рассмотрим, как получить количество дней между датами в JavaScript .
Объект Date в JavaScript
Date JavaScript — это Number тактов (или миллисекунд), прошедших с начала эпохи UNIX (полночь 1 января 1970 г. по всемирному координированному времени).
Несмотря на то, что, по сути, Date определяется в терминах UTC , все его методы получают время и даты в местном часовом поясе:
Date(); // Constructor for a new Date object Date.now(); // Number of miiliseconds elaspsed since January 1, 1970 00:00:00 UTC
Теперь, когда мы знакомы с синтаксисом, давайте посмотрим, как получить количество дней между двумя датами с помощью Date в JavaScript.
Количество дней между датами
Чтобы получить количество дней между двумя датами, мы getNumberOfDays() , которая принимает два объекта Date
function getNumberOfDays(start, end) < const date1 = new Date(start); const date2 = new Date(end); // One day in milliseconds const oneDay = 1000 * 60 * 60 * 24; // Calculating the time difference between two dates const diffInTime = date2.getTime() - date1.getTime(); // Calculating the no. of days between two dates const diffInDays = Math.round(diffInTime / oneDay); return diffInDays; >console.log(getNumberOfDays("2/1/2021", "3/1/2021"));
Этот код приводит к:
Функция принимает две 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:
$ npm install js-joda
Теперь мы можем использовать js-joda API. Давайте перепишем предыдущую функцию, чтобы использовать LocalDate , любезно предоставленный js-joda :
const JSJoda = require('js-joda'); const LocalDate = JSJoda.LocalDate; function getNumberOfDays(start, end) < const start_date = new LocalDate.parse(start); const end_date = new LocalDate.parse(end); return JSJoda.ChronoUnit.DAYS.between(start_date, end_date); >console.log(getNumberOfDays("2021-02-01", "2021-03-01"));
Это также приводит к:
Примечание: этот подход также исключает end_date .
Заключение
В этом руководстве мы рассмотрели, как получить количество дней между датами в JavaScript. Помимо встроенного подхода, основанного на Date , мы также исследовали js-joda , которая была вдохновлена библиотекой Joda-Time , управляемой Java, для гораздо более лаконичного подхода к решению этой проблемы.
Licensed under CC BY-NC-SA 4.0
Разница дней между двумя ВВЕДЕННЫМИ датами JS [дубликат]
Здравствуйте. В процессе работы возникли сложности с выводом количества разницы дней между датами введенными в два input type=»data», как делать разницу между тем что является строкой? Тип data, потому что при запуске страницы js подгружает сегодняшнюю дату и дату плюс 3 дня. А нужно сравнение между введенными, а не установленными, то есть вызов функции будет(логично) через onchange. Спасибо за наводки, надеюсь, объяснил нормально.
Отслеживать
Влад Юдкин
задан 29 сен 2017 в 19:48
Влад Юдкин Влад Юдкин
177 1 1 золотой знак 1 1 серебряный знак 14 14 бронзовых знаков
в прошлом вашем вопросе, точнее в ответе к нему, есть метод парсинга даты, считайте значение, распарсите етим методом.
29 сен 2017 в 20:05
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Сначала нужно привести к формату потребляемому JS, затем создается объекты с типом Date и производится вычитание, умноженное на коэффициэнт. Пример:
var date1 = new Date('12-09-2017'); var date2 = new Date('12-10-2017'); var daysLag = Math.ceil(Math.abs(date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)); console.log(daysLag) >1
Отслеживать
ответ дан 29 сен 2017 в 20:44
164 2 2 бронзовых знака
Вот пример расчёта разницы времени из строковых представлений дат в формате MySQL (yyyy-mm-dd hh:mm:ss):
// Код просто взял из своего приложения, ничего не меняя. // Если формат не соответствует тому, в котором у вас ввод - подгоните регулярки в первых двух строках кода под ваш формат // . var start = new Date(Timings[i]['start_time'].replace(/-/g,"/")); var stop = new Date(Timings[i]['stop_time'].replace(/-/g,"/")); var session = stop - start; var session_string = msToTime(session); // . function msToTime(duration, show_days) < var seconds = parseInt((duration/1000)%60); var minutes = parseInt((duration/(1000*60))%60); var hours = parseInt((duration/(1000*60*60))%24); var days = parseInt(duration/(1000*60*60*24)); hours = (hours < 10) ? "0" + hours : hours; minutes = (minutes < 10) ? "0" + minutes : minutes; seconds = (seconds < 10) ? "0" + seconds : seconds; // Формат возвращаемого значения перепишите как Вам надо. return show_days?(GetNumberWithPostfix(days, 'day') + ", " + hours + ":" + minutes + ":" + seconds):(hours + ":" + minutes + ":" + seconds); >
Базовые операции с датами
Создать дату в JavaScript можно с помощью конструктора Date() , который при вызове без параметров ( const date = new Date() ) вернет дату и время вызова в формате YYYY-MM-DDTHH:mm:ss.sssZ где YYYY-MM-DD — год, месяц и день, T — разделитель между датой и временем, HH:mm:ss.sss — часы, минут, секунды и миллисекунды, а Z — настройки временной зоны. Даты в JavaScript представлены в виде количества миллисекунд, прошедших с 1 января 1970 года по UTC поэтому новую дату можно так же создать с помощью метода .now() глобального объекта Date , который вернет количество миллисекунд до вызова.
const date1 = new Date(); //2023-08-29T11:30:31.224Z const date2 = Date.now(); //1693308631228
Поскольку даты содержат точное количество миллисекунд, прошедших с 1 января 1970 года по UTC разницу между ними можно использовать для замера времени между началом и окончанием выполнения какой-либо операции. Для таких целей лучше использовать метод Date.now() вместо конструктора т.к. он гораздо быстрее потому что не создает при вызове промежуточных объектов и возвращает сразу количество миллисекунд, что может быть важно при проведении большого количества замеров подряд.
const start = Date.now(); (function someCalcs() < //какие-то сложные вычисления >)(); console.log(`Время выполнения: $мс`);
Что бы задать конкретную дату нужно передать ее в конструктор в одном из следующих форматов:
- Указать год, месяц, день и т.д. цифрами через запятую
- Строка вида “ YYYY-MM-DDTHH:mm:ss.sssZ” или ‘December 31, 2023 23:59:59’ фактически такой способ является неявным вызовом метода Date.parse()
- Другой объект даты
- Количество миллисекунд, прошедших с 1 января 1970 года по UTC
При указании даты строкой или перечислением цифр не обязательно указывать точное до мс значение. Если не передать количество мс, секунд, минут или часов — они будут автоматически установлены на 0, дни на 1, месяца на 0 (нумерация месяцев начинается с 0). При этом год нужно передавать полностью, а не последние 2 цифры.
Внести изменения в уже существующий объект даты, можно с помощью методов, которые имеют название .set как .setDate() для дней ( .getDay() вернет день недели числом от 0 до 6), .setFullYear() для года ( .setYear() был удален из стандарта т.к. мог принимать не полное значение года) или .setHours() для часов. Если указать при объявлении даты или передать в один из таких методов несуществующее значение, например 20-й месяц или 25-й час — дата автоматически отформатируется и вместо 25 часов добавит к значений дней единицу, а часы установит на 1.
Важно помнить что Date ссылочный тип данных и два объекта, содержащие одинаковые даты не будут равны друг другу при любом типе сравнения.
const newYear1 = new Date(2023, 11, 31, 23, 59, 59, 999); //2023-12-31T18:59:59.999Z const newYear2 = new Date("2023-12-31T18:59:59.999"); //2023-12-31T13:59:59.999Z const newYear3 = new Date(1704031199999); //передаем количество мс //2023-12-31T13:59:59.999Z console.log(newYear1 === newYear2); //false const ms = newYear1 - newYear2; //при этом разница в ms = 0 //0 newYear1.setDate(32); //устанавливаем несуществующий день в месяце console.log(newYear1); //2024-01-01T18:59:59.999Z дата подстроится под заданные параметры
По аналогии с методами для изменения значений даты, существуют методы для получения части значений. Такие методы имеют название .get или .getUTC для получения получения значений по Гринвичу.
const date = new Date(); //дата и время на момент вызова date.getHours(); //значение часов в месте вызова date.getUTCHours() //значение часов по Гринвичу
Работа с форматированием дат
В JavaScript доступны методы для вывода дат в виде строки разных форматов:
- .toString()
- не принимает параметров и возвращает строку в виде: день недели (Mon), первые три буквы месяца (Aug), день (28), год (2023), время без мс (12:45:30), часовой пояс относительно UTC (GMT-0700) и название часового пояса в скобках (Pacific Daylight Time).
- аналогичен .toString() , но возвращает только дату без времени.
- аналогичен .toString() , но возвращает только время без даты.
- аналогичен .toString() , но возвращает дату по Гринвичу.
- принимает настройки локализации (язык и название страны) и опции (например формат отображения часов в виде 24 или am/pm) и возвращает строку в принятом в указанной стране и языке формате.
- аналогичен .toLocalString() , но возвращает только дату без времени.
- аналогичен .toLocalString() , но возвращает только время без даты.
const date = new Date(); //стандартное форматирование //2023-08-29T14:47:07.820Z console.log(date.toString()); //в строку //Tue Aug 29 2023 19:47:07 GMT+0500 (Yekaterinburg Standard Time) console.log(date.toDateString()); //только дата //Tue Aug 29 2023 console.log(date.toTimeString()); //только время //19:47:07 GMT+0500 (Yekaterinburg Standard Time) console.log(date.toUTCString()); //по Гринвичу //Tue, 29 Aug 2023 14:47:07 GMT console.log(date.toLocaleString("en-US")); //англичйский США //8/29/2023, 7:47:07 PM console.log(date.toLocaleString("en-US", < hour12: false >)); //то же но 24 часовой формат //8/29/2023, 19:47:07 console.log(date.toLocaleDateString("de-DE")); //только дата немецкий Германия //29.8.2023 console.log(date.toLocaleTimeString("ko-KR")); //только время корейский Корея //오후 7:47:07Date можно сериализовать в формат JSON с помощью метода .toJSON() . Конструктор конечно же прекрасно распарсит такую строку.
const toJSON = new Date().toJSON(); //2023-08-29T14:51:52.158Z const toDate = new Date(toJSON); //2023-08-29T14:51:52.158Z console.log(typeof toJSON); //string console.log(typeof toDate);//objectЗаключение
Понимание концепций работы с датами и навык их применения позволят вам создавать более динамичные и функциональные веб-приложения на JavaScript. Не забывайте продолжать изучать и практиковать использование дат в своих проектах, чтобы стать опытным и уверенным разработчиком. Надеюсь что данная статья была полезна для понимания столь важной темы, а если вы хотите изучить основы языка или детально погрузиться в устройство JavaScript я подготовил подробные курсы.
Как получить разницу между двумя датами в днях и в часах в плагине datetimepicker?
Всем доброго времени суток! Прошу помочь с таким вопросом:
На сайте используется плагин datetimepicker для выбора даты начала аренды и даты окончания,
можно выбирать даты и точное время.
Нужно получить разницу между двумя выбранными датами в количестве дней и в точном количестве часов.
Количество дней вроде получилось высчитать, а количество часов не получается
Есть такой код:$("#startdate").datetimepicker(< minTime: 0, minDate: date >); $("#enddate").datetimepicker(< minTime: 0, minDate: date >); $('#enddate').change(function() < var startDate = $('#startdate').datepicker('getDate'); var endDate = $('#enddate').datepicker('getDate'); if (startDate < endDate) < var dayDiff = Math.ceil((endDate - startDate) / (1000 * 60 * 60 * 24)); console.log(dayDiff); var hoursDiff = (dayDiff * 24) / 60; console.log(hoursDiff); >else < alert ("Извините, нельзя выбрать дату окончания аренды ранее даты начала аренды"); $('#enddate').val(""); $('#days').val(""); >>);- Вопрос задан более года назад
- 254 просмотра
Комментировать
Решения вопроса 1
Сергей Соколов @sergiks Куратор тега JavaScript
Сначала получить разницу между двумя объектами Date в часах.
Затем посмотреть, сколько в эти часы влезает целых суток, и вычесть их.const diffHours = Math.ceil((endDate - startDate) / 36e5); // точно в бОльшую сторону округлять? const days = Math.floor(diffHours / 24); const hours = diffHours - days * 24; console.log(`Срок аренды: $ дней и $ часов`);Ответ написан более года назад
Нравится 1 1 комментарий