Як я можу отримати кількість днів між двома датами в JavaScript?


403

Як я можу отримати кількість днів між двома датами в 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>

5
99% випадків, коли користувач просить "кількість днів між двома датами", чого вона не розуміє, - це те, що вона намагається порівняти яблука з грушами. Проблема стає настільки простою, якщо запитати "Скільки ДАТАТІВ В ДАТАХ?", Або скільки квадратів треба перекреслити в календарі. Це позбавляє від часу та проблем у літньому режимі тощо тощо. Плутанина має на увазі нас через структуру даних про дату, яка є чистою нісенітницею. Не існує такого поняття, як дата, є дата, і є час, два дуже чіткі об’єкти як за характером, так і за поведінкою
Михайло Шишков

Для функції, яка розбиває різницю на (цілі) одиниці часу, використовуйте відповідь за адресою stackoverflow.com/a/53092438/3787376 .
Едвард

Я вважаю, що це питання слід видалити або принаймні позначити «уникати», оскільки більшість відповідей або неправильні, або залежать від різних бібліотек.
RobG

Відповіді:


409

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

// new Date("dateString") is browser-dependent and discouraged, so we'll write
// a simple parse function for U.S. date format (which does no error checking)
function parseDate(str) {
    var mdy = str.split('/');
    return new Date(mdy[2], mdy[0]-1, mdy[1]);
}

function datediff(first, second) {
    // Take the difference between the dates and divide by milliseconds per day.
    // Round to nearest whole number to deal with DST.
    return Math.round((second-first)/(1000*60*60*24));
}

alert(datediff(parseDate(first.value), parseDate(second.value)));
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

Ви повинні знати, що "звичайні" API API (без "UTC" у назві) працюють у локальному часовому поясі браузера користувача, тому загалом ви можете зіткнутися з проблемами, якщо ваш користувач перебуває у часовому поясі, у якому ви не працюєте очікуйте, і ваш код повинен мати справу з переходами на літній час. Ви повинні уважно ознайомитися з документацією на об'єкт Date та його методи, і для чогось більш складного, наполегливо подумайте про використання бібліотеки, яка пропонує більш безпечні та потужні API для маніпуляції датою.

Крім того, для ілюстрації, фрагмент використовує назву доступу до windowоб'єкта для стислості, але у виробництві ви повинні використовувати стандартизовані API, такі як getElementById , або, швидше за все, якийсь фреймворк інтерфейсу.


2
Я думаю, що Math.trunc () є більш підходящим. Про всяк випадок, якщо хтось використовує більш точні об’єкти дати (тобто, включаючи години, хвилини та секунди)
Jin Wang

21
Оскільки відповідь, яка позначена правильною та найвищою, що проголосувала (станом на даний момент), варто зауважити, що ця відповідь не відповідає правильному літньому часу. Дивіться замість відповіді Майкла Лю.
осулик

Що саме робить parseDate?
Мохаммед Кермані

2
@ osullic - ця відповідь обробляє літній час за допомогою Math.round , однак, очікується, що буде передано лише рядки дати, а не дату та час.
RobG

2
Пам'ятайте лише, що дата в цьому прикладі у форматі США, тобто MM / DD / РРРР. Якщо вам потрібна версія у Великобританії, тоді вам потрібно змінити parseDateметод на такий:return new Date(mdy[2], mdy[1], mdy[0]-1);
Viqas

207

Станом на це написання, лише одна з інших відповідей правильно обробляє переходи DST (літній час). Ось результати системи, розташованої в Каліфорнії:

                                        1/1/2013- 3/10/2013- 11/3/2013-
User       Formula                      2/1/2013  3/11/2013  11/4/2013  Result
---------  ---------------------------  --------  ---------  ---------  ---------
Miles                   (d2 - d1) / N   31        0.9583333  1.0416666  Incorrect
some         Math.floor((d2 - d1) / N)  31        0          1          Incorrect
fuentesjr    Math.round((d2 - d1) / N)  31        1          1          Correct
toloco     Math.ceiling((d2 - d1) / N)  31        1          2          Incorrect

N = 86400000

Хоча Math.roundповертає правильні результати, я думаю, що це дещо незграбно. Натомість, чітко враховуючи зміни в зміщенні UTC, коли починається або закінчується DST, ми можемо використовувати точну арифметику:

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

alert(daysBetween($('#first').val(), $('#second').val()));

Пояснення

Обчислення дати JavaScript складні, оскільки Dateоб’єкти зберігають час усередині UTC, а не місцевий час. Наприклад, 3.10.2013 00:00 тихоокеанський стандартний час (UTC-08: 00) зберігається як 10.10.2013 8:00 UTC, а 11.11.2013 00:00 тихоокеанський літній час ( UTC-07: 00) зберігається як 11.11.2013 7:00 за UTC. У цей день з півночі до півночі місцевий час у UTC лише 23 години!

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

1. JavaScript ігнорує високосні секунди.


2
Немає необхідності користуватися UTC, прекрасно просто встановити місцеві години на півночі (або однакове значення для обох дат). Дробовий день, запроваджений в режимі літнього часу, становить лише ± 0,04 (а в деяких місцях менше), тому він поєднується з Math.round . ;-) Покладатися на конструктор дат для розбору рядків - це не дуже гарна ідея. Якщо ви дійсно хочете використовувати значення UTC, розберіть Date.UTC(...)в першу чергу рядки, використовуючи .
RobG

2
@RobG: Як я зазначив у своїй відповіді: "Хоча Math.round повертає правильні результати, я думаю, що це дещо незграбно. Натомість, чітко враховуючи зміни в зміщенні UTC, коли починається чи закінчується DST, ми можемо використовувати точну арифметику".
Майкл Лю

Насправді часи, які ви представляли як "неправильні", технічно є правильними. Ви не змінюєте DateTimes на UTC ... ви просто змінюєте час кожного DateTime, щоб отримати штучне ціле число. Округлення не є "незграбним" ... це абсолютно правильний підхід, адже це все, що ви робите в голові: ви округляєте частину часу (години, хвилини, секунди) і просто намагаєтесь отримати ціле номер дня
JDB досі пам’ятає Моніку

116

Найпростіший спосіб отримати різницю між двома датами:

var diff =  Math.floor(( Date.parse(str2) - Date.parse(str1) ) / 86400000); 

Ви отримуєте різницю днів (або NaN, якщо одного або обох не вдалося розібрати). Дата розбору дала результат в мілісекундах, і щоб отримати його за день, ви повинні розділити його на 24 * 60 * 60 * 1000

Якщо ви хочете, щоб його розділили на дні, години, хвилини, секунди та мілісекунди:

function dateDiff( str1, str2 ) {
    var diff = Date.parse( str2 ) - Date.parse( str1 ); 
    return isNaN( diff ) ? NaN : {
        diff : diff,
        ms : Math.floor( diff            % 1000 ),
        s  : Math.floor( diff /     1000 %   60 ),
        m  : Math.floor( diff /    60000 %   60 ),
        h  : Math.floor( diff /  3600000 %   24 ),
        d  : Math.floor( diff / 86400000        )
    };
}

Ось моя реконструйована версія Джеймса:

function mydiff(date1,date2,interval) {
    var second=1000, minute=second*60, hour=minute*60, day=hour*24, week=day*7;
    date1 = new Date(date1);
    date2 = new Date(date2);
    var timediff = date2 - date1;
    if (isNaN(timediff)) return NaN;
    switch (interval) {
        case "years": return date2.getFullYear() - date1.getFullYear();
        case "months": return (
            ( date2.getFullYear() * 12 + date2.getMonth() )
            -
            ( date1.getFullYear() * 12 + date1.getMonth() )
        );
        case "weeks"  : return Math.floor(timediff / week);
        case "days"   : return Math.floor(timediff / day); 
        case "hours"  : return Math.floor(timediff / hour); 
        case "minutes": return Math.floor(timediff / minute);
        case "seconds": return Math.floor(timediff / second);
        default: return undefined;
    }
}

2
Погана відповідь. Math.floor () втратить вас за день, коли годинники рухаються вперед, заощаджуючи денне світло. Math.round () дасть правильну відповідь у більшості ситуацій, але є кращі варіанти і в іншій відповіді.
Філ Б

101

Я рекомендую використовувати бібліотеку moment.js ( http://momentjs.com/docs/#/displaying/difference/ ). Він обробляє літній час правильно та загалом із ним чудово працювати.

Приклад:

var start = moment("2013-11-03");
var end = moment("2013-11-04");
end.diff(start, "days")
1

10
Як і попередження, коли momentjs є великим, це досить велика залежність
Jason Axelson

Це дійсно повинно бути, end.diff(start,"days")хоча код, як написано, буде працювати, тому що дата початку після дати закінчення!
gordon613

40

Я б пішов вперед і захопив цю маленьку утиліту, і в ній ви знайдете для цього функції. Ось короткий приклад:

        <script type="text/javascript" src="date.js"></script>
        <script type="text/javascript">
            var minutes = 1000*60;
            var hours = minutes*60;
            var days = hours*24;

            var foo_date1 = getDateFromFormat("02/10/2009", "M/d/y");
            var foo_date2 = getDateFromFormat("02/12/2009", "M/d/y");

            var diff_date = Math.round((foo_date2 - foo_date1)/days);
            alert("Diff date is: " + diff_date );
        </script>

28
const startDate = '2017-11-08';
const endDate   = '2017-10-01';
const timeDiff  = (new Date(startDate)) - (new Date(endDate));
const days      = timeDiff / (1000 * 60 * 60 * 24)
  1. Встановити дату початку
  2. Встановити дату закінчення
  3. Розрахуйте різницю
  4. Перетворюйте мілісекунди на дні

Оновлення: Я знаю, що це не є частиною ваших запитань, але в цілому я б не рекомендував робити будь-який розрахунок дати чи маніпуляції у ванільному JavaScript, а скоріше використовувати для нього бібліотеку на зразок date- fns або moment.js через багато випадків.


5
Я ціную відповіді на кшталт цих: короткі, прості та не потрібні випадкові залежності! Ура.
daCoda

2
Чи тільки я timeDiffповернувся негативно? Не повинно timeDiffбути (new Date(endDate)) - (new Date(startDate));?
Feyisayo Sonubi

@ feyisayo-sonubi залежить від того, в якому порядку ви переходите в дату початку та закінчення. У цьому прикладі(new Date('2017-11-08')) - (new Date('2017-10-01')) // 3283200000
marcobiedermann

const timeDiff = +(new Date(start)) - +(new Date(end));
Бен Рачикот

Чудово. Хоча я віддаю перевагуreturn (Date.UTC(yr2, mo2-1, dy2) - Date.UTC(yr1, mo1-1, dy1)) / 86400000;
dcromley

13

Використання Moment.js

var future = moment('05/02/2015');
var start = moment('04/23/2015');
var d = future.diff(start, 'days'); // 9
console.log(d);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>


moment.js справді зручний для таких речей, як YTD diff, 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
Sharif

10

Значення дати в JS - це значення часу.

Отже, прямі обчислення дати суперечать:

(2013-11-05 00:00:00) - (2013-11-04 10:10:10) < 1 day

наприклад, нам потрібно перетворити де-другу дату:

(2013-11-05 00:00:00) - (2013-11-04 00:00:00) = 1 day

методом можна обрізати млини в обидві дати:

var date1 = new Date('2013/11/04 00:00:00');
var date2 = new Date('2013/11/04 10:10:10'); //less than 1
var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);

date2 = new Date('2013/11/05 00:00:00'); //1

var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);


9

Краще позбутися DST, Math.ceil, Math.floor тощо за допомогою UTC разів:

var firstDate = Date.UTC(2015,01,2);
var secondDate = Date.UTC(2015,04,22);
var diff = Math.abs((firstDate.valueOf() 
    - secondDate.valueOf())/(24*60*60*1000));

Цей приклад дає різницю 109 днів. 24*60*60*1000є один день у мілісекундах.


9

Для підрахунку днів між двома вказаними датами можна скористатись наступним кодом. Дані, які я використовую тут, - січень 01 2016 та 31 грудня 2016 року

var day_start = new Date("Jan 01 2016");
var day_end = new Date("Dec 31 2016");
var total_days = (day_end - day_start) / (1000 * 60 * 60 * 24);
document.getElementById("demo").innerHTML = Math.round(total_days);
<h3>DAYS BETWEEN GIVEN DATES</h3>
<p id="demo"></p>


9

Можна розрахувати повну різницю днів доказування між двома датами, що перебувають у різних ТЗ, використовуючи наступну формулу:

var start = new Date('10/3/2015');
var end = new Date('11/2/2015');
var days = (end - start) / 1000 / 60 / 60 / 24;
console.log(days);
// actually its 30 ; but due to daylight savings will show 31.0xxx
// which you need to offset as below
days = days - (end.getTimezoneOffset() - start.getTimezoneOffset()) / (60 * 24);
console.log(days);


Це найправильніша відповідь, ви повинні врахувати DST! Спасибі
Gisway

6

Я знайшов це запитання, коли хочу зробити деякий підрахунок на дві дати, але дата має значення годин і хвилин, я змінив відповідь @ 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 годин)

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

var millisecondsPerDay = 24 * 60 * 60 * 1000;
function diffDays(startDate, endDate) {
    return Math.floor(treatAsUTC(endDate) / millisecondsPerDay) - Math.floor(treatAsUTC(startDate) / millisecondsPerDay);
}


6

Я думаю, що рішення не є правильним на 100%, я б використав стелю замість підлоги , кругла буде працювати, але це не правильна операція.

function dateDiff(str1, str2){
    var diff = Date.parse(str2) - Date.parse(str1); 
    return isNaN(diff) ? NaN : {
        diff: diff,
        ms: Math.ceil(diff % 1000),
        s: Math.ceil(diff / 1000 % 60),
        m: Math.ceil(diff / 60000 % 60),
        h: Math.ceil(diff / 3600000 % 24),
        d: Math.ceil(diff / 86400000)
    };
}

4
Дні можуть мати більше 24 годин, а хвилини - більше 60 секунд. Використання Math.ceil () призведе до перевищення в цих випадках.
Rich Dougherty

5

Як щодо використання formatDate від віджета DatePicker? Ви можете використовувати його для перетворення дат у формат часових міток (мілісекунд з 01.01.1970), а потім зробити просте віднімання.


5

function timeDifference(date1, date2) {
  var oneDay = 24 * 60 * 60; // hours*minutes*seconds
  var oneHour = 60 * 60; // minutes*seconds
  var oneMinute = 60; // 60 seconds
  var firstDate = date1.getTime(); // convert to milliseconds
  var secondDate = date2.getTime(); // convert to milliseconds
  var seconds = Math.round(Math.abs(firstDate - secondDate) / 1000); //calculate the diffrence in seconds
  // the difference object
  var difference = {
    "days": 0,
    "hours": 0,
    "minutes": 0,
    "seconds": 0,
  }
  //calculate all the days and substract it from the total
  while (seconds >= oneDay) {
    difference.days++;
    seconds -= oneDay;
  }
  //calculate all the remaining hours then substract it from the total
  while (seconds >= oneHour) {
    difference.hours++;
    seconds -= oneHour;
  }
  //calculate all the remaining minutes then substract it from the total 
  while (seconds >= oneMinute) {
    difference.minutes++;
    seconds -= oneMinute;
  }
  //the remaining seconds :
  difference.seconds = seconds;
  //return the difference object
  return difference;
}
console.log(timeDifference(new Date(2017,0,1,0,0,0),new Date()));


1
Чи можу я попросити вас додати ще трохи контексту навколо вашої відповіді. Відповіді, що стосуються коду, важко зрозуміти. Це допоможе запитувачу та майбутнім читачам, якщо ви зможете додати більше інформації у своєму дописі.
RBT

Я хотів редагувати, але я отримував помилки, я міг надіслати редагування :(.
Noreddine Belhadj Cheikh

2
@ N.Belhadj ви можете замінити всі ці цикли циклу простими операціями div та mod (%)
Михайло Шишков

4

Це може бути не найелегантнішим рішенням, але, здається, відповіді на питання відносно простим бітом коду, я думаю. Не можете використовувати щось подібне:

function dayDiff(startdate, enddate) {
  var dayCount = 0;

  while(enddate >= startdate) {
    dayCount++;
    startdate.setDate(startdate.getDate() + 1);
  }

return dayCount; 
}

Це передбачає, що ви передаєте об'єкти дати як параметри.


4

Якщо у вас є дві часові позначки unix, ви можете скористатися цією функцією (зробивши трохи більш багатослівною для наочності):

// Calculate number of days between two unix timestamps
// ------------------------------------------------------------
var daysBetween = function(timeStampA, timeStampB) {
    var oneDay = 24 * 60 * 60 * 1000; // hours * minutes * seconds * milliseconds
    var firstDate = new Date(timeStampA * 1000);
    var secondDate = new Date(timeStampB * 1000);
    var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    return diffDays;
};

Приклад:

daysBetween(1096580303, 1308713220); // 2455

4

Будьте обережні, використовуючи мілісекунди .

Date.getTime () повертає мілісекунди і робить математичну операцію з мілісекунд потрібно включити

  • Перехід на літній час (DST)
  • перевірка наявності однакової дати обох дат (години, хвилини, секунди, мілісекунди)
  • переконайтеся, що потрібна поведінка різниць днів: 19 вересня 2016 - 29 вересня 2016 = різниця на 1 або 2 дні?

Приклад із коментаря вище - найкраще рішення, яке я знайшов поки що https://stackoverflow.com/a/11252167/2091095 . Але використовуйте +1 для його результату, якщо ви хочете рахувати всі дні, що займаються.

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

var diff = daysBetween($('#first').val(), $('#second').val()) + 1;

4

Date.prototype.days = function(to) {
  return Math.abs(Math.floor(to.getTime() / (3600 * 24 * 1000)) - Math.floor(this.getTime() / (3600 * 24 * 1000)))
}


console.log(new Date('2014/05/20').days(new Date('2014/05/23'))); // 3 days

console.log(new Date('2014/05/23').days(new Date('2014/05/20'))); // 3 days


3

У мене був такий самий випуск у Angular. Я роблю копію, бо ще він замінить перше побачення. Обидві дати повинні мати час 00:00:00 (очевидно)

 /*
* Deze functie gebruiken we om het aantal dagen te bereken van een booking.
* */
$scope.berekenDagen = function ()
{
    $scope.booking.aantalDagen=0;

    /*De loper is gelijk aan de startdag van je reservatie.
     * De copy is nodig anders overschijft angular de booking.van.
     * */
    var loper = angular.copy($scope.booking.van);

    /*Zolang de reservatie beschikbaar is, doorloop de weekdagen van je start tot einddatum.*/
    while (loper < $scope.booking.tot) {
        /*Tel een dag op bij je loper.*/
        loper.setDate(loper.getDate() + 1);
        $scope.booking.aantalDagen++;
    }

    /*Start datum telt natuurlijk ook mee*/
    $scope.booking.aantalDagen++;
    $scope.infomsg +=" aantal dagen: "+$scope.booking.aantalDagen;
};

3

Я використовував код нижче, щоб експериментувати функцію дати публікації для публікації новин. Я обчислюю хвилину чи годину чи день або рік на основі дати публікації та поточної дати.

var startDate= new Date("Mon Jan 01 2007 11:00:00");
var endDate  =new Date("Tue Jan 02 2007 12:50:00");
var timeStart = startDate.getTime();
var timeEnd = endDate.getTime();
var yearStart = startDate.getFullYear();
var yearEnd   = endDate.getFullYear();
if(yearStart == yearEnd)
 {
  var hourDiff = timeEnd - timeStart; 
  var secDiff = hourDiff / 1000;
  var minDiff = hourDiff / 60 / 1000; 
  var hDiff = hourDiff / 3600 / 1000; 
  var myObj = {};
  myObj.hours = Math.floor(hDiff);
  myObj.minutes = minDiff  
  if(myObj.hours >= 24)
   {
    console.log(Math.floor(myObj.hours/24) + "day(s) ago")
   } 
 else if(myObj.hours>0)
  {
   console.log(myObj.hours +"hour(s) ago")
  }
 else
  {
   console.log(Math.abs(myObj.minutes) +"minute(s) ago")
  }
}
else
{
var yearDiff = yearEnd - yearStart;
console.log( yearDiff +" year(s) ago");
}

Поясніть, будь ласка, свій код, і ви вирішили проблему, просто вставлення коду вважається поганою відповіді.
Марко Скаббіоло

2
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
Майкл Паркер

Дякую @ MarcoScabbiolo, @ Майкл Паркер за коментарі. Оскільки я новачок у Stackoverflow з точки зору відповіді, мені не було відомо про те, як слід вирішити рішення
Рамес Рахат

3

якщо ви хочете мати DateArray з датами, спробуйте це:

<script>
        function getDates(startDate, stopDate) {
        var dateArray = new Array();
        var currentDate = moment(startDate);
        dateArray.push( moment(currentDate).format('L'));

        var stopDate = moment(stopDate);
        while (dateArray[dateArray.length -1] != stopDate._i) {
            dateArray.push( moment(currentDate).format('L'));
            currentDate = moment(currentDate).add(1, 'days');
        }
        return dateArray;
      }
</script>

DebugSnippet


3

Найпростіший спосіб обчислити дні між двома датами - це вилучити обидві їх часові компоненти, тобто встановити години, хвилини, секунди і мілісекунди на 0, а потім відняти їх час і занурити його в мілісекунди на один день.

var firstDate= new Date(firstDate.setHours(0,0,0,0));
var secondDate= new Date(secondDate.setHours(0,0,0,0));
var timeDiff = firstDate.getTime() - secondDate.getTime();
var diffDays =timeDiff / (1000 * 3600 * 24);

Проблема з вашим рішенням полягає в тому, що ви вважаєте, що firstDate та secondDate будуть датами, які потім не потрібно змінювати їх на дату знову, і якщо вони не дата *, яких немає), ви отримаєте помилку на setHours. щоб виправити це, вам потрібно перемістити setHours зnew Date
AaA

2
function formatDate(seconds, dictionary) {
    var foo = new Date;
    var unixtime_ms = foo.getTime();
    var unixtime = parseInt(unixtime_ms / 1000);
    var diff = unixtime - seconds;
    var display_date;
    if (diff <= 0) {
        display_date = dictionary.now;
    } else if (diff < 60) {
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.second;
        } else {
            display_date = diff + ' ' + dictionary.seconds;
        }
    } else if (diff < 3540) {
        diff = Math.round(diff / 60);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.minute;
        } else {
            display_date = diff + ' ' + dictionary.minutes;
        }
    } else if (diff < 82800) {
        diff = Math.round(diff / 3600);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.hour;
        } else {
            display_date = diff + ' ' + dictionary.hours;
        }
    } else {
        diff = Math.round(diff / 86400);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.day;
        } else {
            display_date = diff + ' ' + dictionary.days;
        }
    }
    return display_date;
}

2

Простий легкий і складний. Ця функція буде викликатися кожні 1 секунду для оновлення часу.

const year = (new Date().getFullYear());
const bdayDate = new Date("04,11,2019").getTime();  //mmddyyyy

// countdown
let timer = setInterval(function() {

// get today's date
const today = new Date().getTime();

// get the difference
const diff = bdayDate - today;

// math
let days = Math.floor(diff / (1000 * 60 * 60 * 24));
let hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
let minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
let seconds = Math.floor((diff % (1000 * 60)) / 1000);

}, 1000);

1

Краще рішення від

Ігнорування часової частини

він поверне 0, якщо обидві дати однакові.

function dayDiff(firstDate, secondDate) {
  firstDate = new Date(firstDate);
  secondDate = new Date(secondDate);
  if (!isNaN(firstDate) && !isNaN(secondDate)) {
    firstDate.setHours(0, 0, 0, 0); //ignore time part
    secondDate.setHours(0, 0, 0, 0); //ignore time part
    var dayDiff = secondDate - firstDate;
    dayDiff = dayDiff / 86400000; // divide by milisec in one day
    console.log(dayDiff);
  } else {
    console.log("Enter valid date.");
  }
}

$(document).ready(function() {
  $('input[type=datetime]').datepicker({
    dateFormat: "mm/dd/yy",
    changeMonth: true,
    changeYear: true
  });
  $("#button").click(function() {
    dayDiff($('#first').val(), $('#second').val());
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<input type="datetime" id="first" value="12/28/2016" />
<input type="datetime" id="second" value="12/28/2017" />
<input type="button" id="button" value="Calculate">


1

Внесок до дати до 1970-01-01 та після 2038-01-19

function DateDiff(aDate1, aDate2) {
  let dDay = 0;
  this.isBissexto = (aYear) => {
    return (aYear % 4 == 0 && aYear % 100 != 0) || (aYear % 400 == 0);
  };
  this.getDayOfYear = (aDate) => {
    let count = 0;
    for (let m = 0; m < aDate.getUTCMonth(); m++) {
      count += m == 1 ? this.isBissexto(aDate.getUTCFullYear()) ? 29 : 28 : /(3|5|8|10)/.test(m) ? 30 : 31;
    }
    count += aDate.getUTCDate();
    return count;
  };
  this.toDays = () => {
    return dDay;
  };
  (() => {
    let startDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate1.toISOString()) : new Date(aDate2.toISOString());
    let endDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate2.toISOString()) : new Date(aDate1.toISOString());
    while (startDate.getUTCFullYear() != endDate.getUTCFullYear()) {
      dDay += (this.isBissexto(startDate.getFullYear())? 366 : 365) - this.getDayOfYear(startDate) + 1;
      startDate = new Date(startDate.getUTCFullYear()+1, 0, 1);
    }
    dDay += this.getDayOfYear(endDate) - this.getDayOfYear(startDate);
  })();
}

0
   function validateDate() {
        // get dates from input fields
        var startDate = $("#startDate").val();
        var endDate = $("#endDate").val();
        var sdate = startDate.split("-");
        var edate = endDate.split("-");
        var diffd = (edate[2] - sdate[2]) + 1;
        var leap = [ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        var nonleap = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        if (sdate[0] > edate[0]) {
            alert("Please enter End Date Year greater than Start Date Year");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[1] > edate[1]) {
            alert("Please enter End Date month greater than Start Date month");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[2] > edate[2]) {
            alert("Please enter End Date greater than Start Date");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else {
            if (sdate[0] / 4 == 0) {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + leap[sdate[1]++];
                }
            } else {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + nonleap[sdate[1]++];
                }
            }
            document.getElementById("numberOfDays").value = diffd;
        }
    }

0

Ви можете використовувати UnderscoreJS для форматування та обчислення різниці.

Демо https://jsfiddle.net/sumitridhal/8sv94msp/

 var startDate = moment("2016-08-29T23:35:01");
var endDate = moment("2016-08-30T23:35:01");  
  

console.log(startDate);
console.log(endDate);

var resultHours = endDate.diff(startDate, 'hours', true);

document.body.innerHTML = "";
document.body.appendChild(document.createTextNode(resultHours));
body { white-space: pre; font-family: monospace; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.