Разница дней между двумя ВВЕДЕННЫМИ датами 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); >
Как получить разницу между двумя датами в днях и в часах в плагине 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(""); >>);
- Вопрос задан более года назад
- 255 просмотров
Комментировать
Решения вопроса 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 комментарий
Разница в месяцах между двумя датами в JavaScript
Месяц не очень точная единица измерения, потому что длина месяца изменяется в зависимости от того, какой месяц это. Если интервал длится 30 дней между январем и февралем, это меньше 1 месяца, если вы думаете с точки зрения 31-дневного месяца, и более 1 месяца, если вы считаете 28 или 29 дней февраля.
Mark Byers 29 март 2010, в 07:40
Не очень четко определенный вопрос. 28 февраля с 23:58 до 1 марта 00:01 один месяц? Или только один день? Или всего три минуты? Или все три?
Thilo 29 март 2010, в 07:43
@Thilo Thilo У кого-то, кому нужно это реализовать, скорее всего, не будет ответов, поскольку их менеджер не знает, о чем они спрашивают. 🙂
AlbertEngelB 13 май 2015, в 14:54
Показать ещё 1 комментарий
Поделиться:
24 ответа
Лучший ответ
Определение «количество месяцев в разнице» подлежит многому толкованию.: -)
Вы можете получить год, месяц и день месяца из объекта даты JavaScript. В зависимости от того, какую информацию вы ищете, вы можете использовать их для определения количества месяцев между двумя моментами времени.
Например, вне манжеты, это выясняет, сколько полных месяцев лежит между двумя датами, не считая частичных месяцев (например, за исключением месяца, в котором находится каждая дата):
function monthDiff(d1, d2) < var months; months = (d2.getFullYear() - d1.getFullYear()) * 12; months -= d1.getMonth() + 1; months += d2.getMonth(); return months monthDiff( new Date(2008, 10, 4), // November 4th, 2008 new Date(2010, 2, 12) // March 12th, 2010 ); // Result: 15: December 2008, all of 2009, and Jan & Feb 2010 monthDiff( new Date(2010, 0, 1), // January 1st, 2010 new Date(2010, 2, 12) // March 12th, 2010 ); // Result: 1: February 2010 is the only full month between them monthDiff( new Date(2010, 1, 1), // February 1st, 2010 new Date(2010, 2, 12) // March 12th, 2010 ); // Result: 0: There are no *full* months between them
(Обратите внимание, что значения месяца в JavaScript начинаются с 0 = Январь.)
Включение дробных месяцев в вышеизложенное намного сложнее, потому что три дня в типичном феврале составляют большую часть этого месяца (~ 10,714%), чем три дня в августе (~ 9,677%), и, конечно, даже февраль движущейся цели в зависимости от того, является ли он високосным годом.
Есть также некоторые библиотеки даты и времени для JavaScript, которые, вероятно, упрощают эту задачу.
T.J. Crowder 29 март 2010, в 08:13
Поделиться
+1 для нюансов.
Jonathan Feinberg 29 март 2010, в 08:15
@T.J.:+1 для вашей функции, это хороший пример того, с чего может начаться OP, но я думаю, что по крайней мере «полный» месяц должен учитываться (например) с 1 февраля по 31 марта 🙂
Andy E 29 март 2010, в 08:19
@Andy: Энди: Согласен, это всего лишь отправная точка. Если говорить о полном месяце с 2010/2/1 по 2010/3/31, не считая усложнения вещей аналогично дробным месяцам, как бы мы справились с 23:59:59 с 2010/2/1 по 00:00:01? на 31.03.2010? Это ~ 2 дня, не считая полного месяца! 😉 Для тщательности действительно потребуется правильный календарь, учитывающий високосные годы, разрывы (такие как Григорианская корректировка в 1582 г.) и т. Д., Поскольку объекты JavaScript Date могут возвращаться назад примерно на 285 тыс. Лет. Но вы все равно не можете использовать объекты JS Date для такого рода вещей, они не обрабатывают дополнительные секунды. 🙂
T.J. Crowder 29 март 2010, в 08:40
[geek_mode] Расширение на григорианскую вещь: JavaScript использует только экстраполированный григорианский календарь и игнорирует дополнительные секунды. Это означает, среди прочего, что любая дата до 15 октября 1582 года будет некорректно отображаться при запросе года, месяца или дня (например, когда она превращена в строку), потому что JavaScript не обрабатывает корректировку (за день до 15 октября 1582 года было 4 октября 1582 года; не было 5-14 числа в этом году). [/ geek_mode]
T.J. Crowder 29 март 2010, в 08:50
@T.J:Конечно, как указано в вашем ответе, это действительно зависит от фактических требований ОП. Единственное полужизнеспособное решение, которое я мог придумать, включало в себя повторение в обратном направлении по второму параметру даты, проверку високосного года и вычитание количества дней в предыдущем месяце из даты, при этом каждый раз увеличивая переменную на 1, а затем вычисляя дробь за последний месяц 🙂 Я даже собирался написать это, но сейчас утро понедельника, и я еще даже не выпил кофе 😉 Re: [geek_mode] Вы действительно знаете свои вещи!
Andy E 29 март 2010, в 09:02
monthDiff (new Date (), new Date ()) возвращает -1, что меня действительно удивляет 🙁
Petr 18 янв. 2013, в 15:03
@Petr: Да, он должен иметь return Math.max(0, months); или похожее в конце, не так ли? Но в любом случае это странное определение (исключая весь месяц, в котором находится каждая дата).
T.J. Crowder 18 янв. 2013, в 15:14
@T.J:Вам нужно либо добавить 1 после getMonth (), либо удалить его. В противном случае это неправильно.
Arturo Hernandez 31 июль 2013, в 19:36
@ArturoHernandez: Нет, это преднамеренно ( months += d2.getMonth(); сокращение от months += d2.getMonth() + 1 - 1; - мы не учитываем [частичное] в прошлом месяце). Опять же, это все о том, как вы определяете «месяцы между», как я подробно описал выше.
T.J. Crowder 31 июль 2013, в 20:44
Вы уверены, что +1 в "месяцы - = d1.getMonth () + 1;" является необходимым? При этом +1 разница между 2013-01-17 и 2013-02-16 равна 0.
Briganti 16 янв. 2014, в 09:00
Добавление if (d2.getDate() >= d1.getDate()) < months++ >непосредственно перед возвратом месяцев может повысить точность.
calvin 20 март 2014, в 00:59
@T.J.CrowderЯ прошу прощения, я не хотел сказать, что ваш ответ был недостаточным (на самом деле это было почти то, что мне нужно). Я просто пытался добавить к обсуждению. Кажется, что другие, пытающиеся получить количество простых месяцев (в отличие от полных календарных месяцев), пытались найти несколько сложных решений, но сравнение дат достаточно надежно, поэтому я решил добавить. Моя плохая формулировка плохо. Еще раз спасибо за ваш ответ!
calvin 20 март 2014, в 21:35
Мне пришлось убрать +1 за months -= d1.getMonth() + 1; чтобы точно определить количество месяцев между двумя датами, но большое спасибо за почти идеальную отправную точку!
bryan 19 авг. 2014, в 23:19
@bryan: Брайан: Рад, что это было полезно. Смотрите обсуждение выше, это все о том, как вы определяете «месяцы между». 🙂
T.J. Crowder 20 авг. 2014, в 06:32
Я получаю месяц 0, если я передаю месяц как monthDiff (новая дата (2010, 01, 1), новая дата (2010, 02, 12));
forgottofly 23 сен. 2015, в 13:27
@forgottofly: я начал с: «Определение« количество месяцев в разнице »может быть сильно интерпретировано». А потом позже: «Например, вне манеры, это выясняет, сколько полных месяцев лежит между двумя датами, не считая неполных месяцев (например, исключая месяц, в котором находится каждая дата )». Так что, конечно, вы получаете ноль за это. На самом деле, посмотрите на мой последний пример.
T.J. Crowder 23 сен. 2015, в 17:30
@T.J.CrowderЯ получил это, спасибо 🙂
forgottofly 24 сен. 2015, в 06:33
Как я могу отобразить названия месяцев, которые находятся между двумя датами?
forgottofly 24 сен. 2015, в 07:21
переместить +1 на следующую строку months += d2.getMonth() + 1; и вы получите месяцы, включая два указанных месяца
artemnih 16 май 2016, в 11:46
не работает правильно
Muhammad Raheel 19 сен. 2018, в 14:53
Показать ещё 18 комментариев
Если вы не считаете день месяца, это гораздо более простое решение
function monthDiff(dateFrom, dateTo) < return dateTo.getMonth() - dateFrom.getMonth() + (12 * (dateTo.getFullYear() - dateFrom.getFullYear())) >//examples console.log(monthDiff(new Date(2000, 01), new Date(2000, 02))) // 1 console.log(monthDiff(new Date(1999, 02), new Date(2000, 02))) // 12 full year console.log(monthDiff(new Date(2009, 11), new Date(2010, 0))) // 1
Tom Gullen 30 нояб. 2010, в 11:13
Поделиться
Это самый короткий и простой для понимания код, который я когда-либо видел!
Omar 18 сен. 2012, в 00:26
Ничего сложного в этом нет, за исключением того, что каждый начатый месяц считается. 31/03/2011 -> 01/05/2011 будет два месяца, а также 01/03/2011 -> 31/05/2011, но это должно быть три, если быть точным.
Natim 05 сен. 2013, в 17:05
Этот ответ является более полным: stackoverflow.com/a/15158873/186202
Natim 05 сен. 2013, в 17:07
Если вы просто хотите узнать количество месяцев, это идеальный . Если вам нужно знать по дням месяца, это не сработает.
OSDM 05 окт. 2015, в 06:56
Начните с того, что 2018/01 и 2017/01 годы разделены на 12 месяцев. Работайте задом наперед. Этот ответ получает это. 😉
Gerard ONeill 21 июнь 2018, в 23:20
Dev-X 07 март 2019, в 21:19
Показать ещё 4 комментария
Иногда вы можете получить только количество месяцев между двумя датами, полностью игнорирующими дневную часть. Например, если у вас были две даты - 2013/06/21 и 2013/10/18-, и вы заботились только о частях 2013/06 и 2013/10, вот сценарии и возможные решения:
var date1=new Date(2013,5,21);//Remember, months are 0 based in JS var date2=new Date(2013,9,18); var year1=date1.getFullYear(); var year2=date2.getFullYear(); var month1=date1.getMonth(); var month2=date2.getMonth(); if(month1===0) < //Have to take into account month1++; month2++; >var numberOfMonths;
1.Если вы хотите просто количество месяцев между двумя датами, исключая как month1, так и month2
numberOfMonths = (year2 - year1) * 12 + (month2 - month1) - 1;
2.Если вы хотите включить любой из месяцев
numberOfMonths = (year2 - year1) * 12 + (month2 - month1);
3.Если вы хотите включить оба месяца
numberOfMonths = (year2 - year1) * 12 + (month2 - month1) + 1;
Mikayil Abdullayev 01 март 2013, в 14:31
Поделиться
Хороший! Работал идеально для меня.
user2541120 23 авг. 2013, в 04:20
Для последнего я буду рекомендовать: numberOfMonths=(year2-year1)*12+(month2-month1)+1; который делает то же самое, но более семантически правильно для меня
Natim 05 сен. 2013, в 17:09
Да, хороший и более элегантный подход.
Mikayil Abdullayev 06 сен. 2013, в 04:24
Это был лучший ответ. Спасибо!
marienke 29 май 2017, в 14:47
Это просто и чисто. Спасибо за написание отличного кода.
zeros-and-ones 22 фев. 2018, в 23:08
Показать ещё 3 комментария
Здесь функция, которая точно обеспечивает количество месяцев между двумя датами.
Поведение по умолчанию рассчитано только на целые месяцы, например. 3 месяца и 1 день приведут к разнице в 3 месяца. Вы можете предотвратить это, установив параметр roundUpFractionalMonths как true , поэтому разница в 3 месяца и 1 день будет возвращена через 4 месяца.
Принятый ответ выше (ответ T.J. Crowder) неточен, иногда он возвращает неправильные значения.
Например, monthDiff(new Date('Jul 01, 2015'), new Date('Aug 05, 2015')) возвращает 0 , что, очевидно, неверно. Правильная разница составляет либо 1 месяц, либо 2 месяца округления.
Здесь функция, которую я написал:
function getMonthsBetween(date1,date2,roundUpFractionalMonths) < //Months will be calculated between start and end dates. //Make sure start date is less than end date. //But remember if the difference should be negative. var startDate=date1; var endDate=date2; var inverse=false; if(date1>date2) < startDate=date2; endDate=date1; inverse=true; >//Calculate the differences between the start and end dates var yearsDifference=endDate.getFullYear()-startDate.getFullYear(); var monthsDifference=endDate.getMonth()-startDate.getMonth(); var daysDifference=endDate.getDate()-startDate.getDate(); var monthCorrection=0; //If roundUpFractionalMonths is true, check if an extra month needs to be added from rounding up. //The difference is done by ceiling (round up), e.g. 3 months and 1 day will be 4 months. if(roundUpFractionalMonths===true && daysDifference>0) < monthCorrection=1; >//If the day difference between the 2 months is negative, the last month is not a whole month. else if(roundUpFractionalMonths!==true && daysDifference <0) < monthCorrection=-1; >return (inverse?-1:1)*(yearsDifference*12+monthsDifference+monthCorrection); >;
Francisc 14 нояб. 2014, в 13:57
Поделиться
Если серьезно, кто проголосовал за это? Он прав, принятый ответ просто . неправильный.
Michael Blackburn 06 авг. 2015, в 18:27
Это самый подходящий ответ.
Kalyan Chavali 21 сен. 2016, в 06:23
Это неправильно, если предположить, что date1 - 22 января, а date2 - 22 августа. Тогда он возвращает 7, что, очевидно, должно быть 8?
Nicolai Harbo 22 авг. 2017, в 11:09
Показать ещё 1 комментарий
Если вам нужно засчитывать полные месяцы, независимо от того, в течение месяца 28, 29, 30 или 31 дня. Ниже должно работать.
var months = to.getMonth() - from.getMonth() + (12 * (to.getFullYear() - from.getFullYear())); if(to.getDate() < from.getDate())< months--; >return months;
Это расширенная версия ответа https://stackoverflow.com/questions/2536379/difference-in-months-between-two-dates-in-javascript, но исправляет случай, когда он вычисляет 1 месяц для случая с 31 января по 1 февраля (1день).
Это будет охватывать следующее:
- 1 января - 31 января --- > 30days --- > приведет к 0 (логично, так как это не полный месяц)
- 1 февраля - 1 марта --- > 28 или 29 дней --- > приведет к 1 (логично, так как это полный месяц).
- 15 февраля - 15 марта --- > 28 или 29 дней --- > приведет к 1 (логический с месяца прошло)
- 31 января - 1 февраля --- > 1 день --- > приведет к 0 (очевидно, но упомянутый ответ в результатах сообщения за 1 месяц)
harun 09 янв. 2014, в 13:12
Поделиться
Это то, о чем я думал, что пришел сюда для проверки, и это единственный ответ, который имеет для меня смысл
Andreas 07 сен. 2014, в 06:19
Это не работает при сравнении двух месяцев, когда месяц короче. Например, с 31 марта по 30 апреля. Это весь апрель, поэтому ответ должен быть «1».
Michael Blackburn 27 фев. 2015, в 18:36
Разница в месяцах между двумя датами в JavaScript:
start_date = new Date(year, month, day); //Create start date object by passing appropiate argument end_date = new Date(new Date(year, month, day)
Всего месяцев между start_date и end_date:
total_months = (end_date.getFullYear() - start_date.getFullYear())*12 + (end_date.getMonth() - start_date.getMonth())
user3355933 15 март 2014, в 15:08
Поделиться
Пожалуйста, используйте код для вставки копии: jsfiddle.net/b1prajwm
YumYumYum 08 окт. 2015, в 00:06
Я знаю, что это действительно поздно, но все равно публикуйте на всякий случай, если это поможет другим. Вот функция, с которой я столкнулся, которая, похоже, хорошо разбирается в различиях между месяцами между двумя датами. Это, по общему признанию, намного бесполезнее, чем у мистера Коудера, но дает более точные результаты, пройдя через объект даты. Это в AS3, но вы должны просто убрать сильную типизацию, и у вас будет JS. Не стесняйтесь, чтобы он выглядел лучше всех!
function countMonths ( startDate:Date, endDate:Date ):int < var stepDate:Date = new Date; stepDate.time = startDate.time; var monthCount:int; while( stepDate.time if ( stepDate != endDate ) < monthCount -= 1; >return monthCount; >
James 21 июль 2010, в 22:15
Поделиться
Размещение правильного JavaScript будет хорошим началом.
RobG 23 сен. 2015, в 14:14
Это наиболее вероятный правильный подход для большинства ситуаций. В нашем календаре так много исключений и капризов, лучший подход - делегировать обработку их в хорошо проверенную библиотеку, такую как Date (). Для большинства (коротких) промежутков это даст тот же ответ, что и рассчитанные подходы, но когда вы имеете дело с длинными промежутками времени (включая високосные годы, високосные годы, которые не являются високосными годами, високосные годы). секунд и т. д.) вы, скорее всего, столкнетесь с исключением, когда вычитание месяцев и добавление лет будет неправильным. Смотрите мой ответ для исключений, когда расчет будет лучше.
Michael Blackburn 16 нояб. 2016, в 15:39
Рассмотрим каждую дату в месяцах, затем вычтите, чтобы найти разницу.
var past_date = new Date('11/1/2014'); var current_date = new Date(); var difference = (current_date.getFullYear()*12 + current_date.getMonth()) - (past_date.getFullYear()*12 + past_date.getMonth());
Это даст вам разницу между месяцами между двумя датами, игнорируя дни.
internet-nico 22 нояб. 2015, в 07:31
Поделиться
Существует два подхода, математические и быстрые, но подверженные капризам в календаре, или итеративные и медленные, но обрабатывающие все странности (или, по крайней мере, делегаты, обрабатывающие их в хорошо протестированной библиотеке).
Если вы выполните итерацию по календарю, увеличив начальную дату на один месяц и посмотрев, пройдем ли дата окончания. Это делегирует обработку аномалий во встроенные классы Date(), но может быть медленным, если вы делаете это для большого количества дат. Ответ Джеймса использует такой подход. Насколько мне не нравится эта идея, я считаю, что это "самый безопасный" подход, и если вы делаете только один расчет, разница в производительности действительно незначительна. Мы склонны пытаться переопределить задачи, которые будут выполняться только один раз.
Теперь, , если, вы вычисляете эту функцию в наборе данных, вы, вероятно, не хотите запускать эту функцию в каждой строке (или не дай бог, несколько раз за запись). В этом случае вы можете использовать почти любой из других ответов здесь, кроме принятого ответа, который просто неверен (разница между new Date() и new Date() равна -1)?
Здесь мой удар по математическому и быстрому подходу, который учитывает разные месячные длины и високосные годы. Вы действительно должны использовать только такую функцию, если вы будете применять ее к набору данных (повторите этот расчет снова и снова). Если вам просто нужно сделать это один раз, используйте итеративный подход Джеймса выше, поскольку вы делегируете обработку всех (многих) исключений для объекта Date().
function diffInMonths(from, to) < var months = to.getMonth() - from.getMonth() + (12 * (to.getFullYear() - from.getFullYear())); if(to.getDate() < from.getDate())< var newFrom = new Date(to.getFullYear(),to.getMonth(),from.getDate()); if (to < newFrom && to.getMonth() == newFrom.getMonth() && to.getYear() %4 != 0)< months--; >> return months; >
Michael Blackburn 27 фев. 2015, в 20:33
Поделиться
Развернуть на @T.J. ответьте, если вы ищете простые месяцы, а не полные календарные месяцы, вы можете просто проверить, превышает ли d2 дату или значение, чем d1. То есть, если d2 позже в месяце, чем d1 в месяце, то еще месяц. Поэтому вы должны просто сделать это:
function monthDiff(d1, d2) < var months; months = (d2.getFullYear() - d1.getFullYear()) * 12; months -= d1.getMonth() + 1; months += d2.getMonth(); // edit: increment months if d2 comes later in its month than d1 in its month if (d2.getDate() >= d1.getDate()) months++ // end edit return months monthDiff( new Date(2008, 10, 4), // November 4th, 2008 new Date(2010, 2, 12) // March 12th, 2010 ); // Result: 16; 4 Nov – 4 Dec '08, 4 Dec '08 – 4 Dec '09, 4 Dec '09 – 4 March '10
Это не полностью учитывает проблемы времени (например, 3 марта в 16:00 и 3 апреля в 15:00), но это более точно и всего лишь пару строк кода.
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