Як я можу отримати різницю між двома датами в JavaScript?


111

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

Відповіді:


73

У JavaScript дати можна перетворити на кількість мілісекунд з епохи, викликавши getTime()метод або просто використовуючи дату в числовому виразі.

Отже, щоб отримати різницю, просто відніміть дві дати.

Щоб створити нову дату на основі різниці, просто переведіть число конструкторів у мілісекунді.

var oldBegin = ...
var oldEnd = ...
var newBegin = ...

var newEnd = new Date(newBegin + oldEnd - oldBegin);

Це має просто працювати

EDIT : виправлена ​​помилка, яку вказує @bdukes

Редагувати :

Для пояснення поведінки, oldBegin, oldEndі newBeginє Dateекземплярами. Виклик операторів +і -запустить автоматичне кастинг Javascript і автоматично викличе valueOf()метод прототипу цих об'єктів. Буває, що valueOf()метод реалізований в Dateоб'єкті як виклик до getTime().

Так в основному: date.getTime() === date.valueOf() === (0 + date) === (+date)


Який формат потрібен для роботи .getTime () ... Наприклад - нова дата ('22 -12-2012 00:00 '). GetTime () не працюватиме ... Будь-які ідеї?
Jimmyt1988

1
Для розбору дат у JS, я пропоную вам поглянути на це питання: stackoverflow.com/questions/1576753/…
Вінсент Роберт,

8
Чи повинні бути OldBegin, oldEnd і NewBegin Dateоб'єктами? Важко сказати, яким типом об’єкта вони повинні бути, оскільки декларація змінної тут опущена.
Андерсон Грін

Також є функція, яку ви можете використовувати для додавання чи віднімання дат у JavaScript: stackoverflow.com/a/1214753/975097
Anderson Green

Будьте обережні, додаючи цифри та дні. Дивіться мою відповідь нижче для пояснення
Dan

24

JavaScript чудово підтримує різницю дат у вікні

var msMinute = 60*1000, 
    msDay = 60*60*24*1000,
    a = new Date(2012, 2, 12, 23, 59, 59),
    b = new Date("2013 march 12");


console.log(Math.floor((b - a) / msDay) + ' full days between');
console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between');

Тепер кілька підводних каменів. Спробуйте це:

console.log(a - 10);
console.log(a + 10);

Тож якщо у вас є ризик додати число та дату, перетворіть Дату numberбезпосередньо.

console.log(a.getTime() - 10);
console.log(a.getTime() + 10);

Мій приклад кулака демонструє потужність об'єкта Date, але він насправді видається бомбою


Ден, я знайшов твій приклад найпростішим для розуміння та наслідування. Дякую.
Мелані

5
"Підводні камені" насправді є типовими налаштуваннями на основі мовної специфікації. Оператор віднімання -примушує аргументи до числа, тому Дата повертає своє значення часу. +Оператор перевантажений, тому , можливо , зробити додавання, примус до номера або конкатенації. Оскільки Дати в цьому випадку примушуються до String, +це об'єднання. Плутанина - не вина об’єкта Date, а операторів перевантаження.
RobG

9

Див. JsFiddle DEMO

    var date1 = new Date();    
    var date2 = new Date("2025/07/30 21:59:00");
    //Customise date2 for your required future time

    showDiff();

function showDiff(date1, date2){

    var diff = (date2 - date1)/1000;
    diff = Math.abs(Math.floor(diff));

    var days = Math.floor(diff/(24*60*60));
    var leftSec = diff - days * 24*60*60;

    var hrs = Math.floor(leftSec/(60*60));
    var leftSec = leftSec - hrs * 60*60;

    var min = Math.floor(leftSec/(60));
    var leftSec = leftSec - min * 60;

    document.getElementById("showTime").innerHTML = "You have " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds before death.";

setTimeout(showDiff,1000);
}

для вашого HTML-коду:

<div id="showTime"></div>

4

Якщо вас не хвилює компонент часу, ви можете використовувати .getDate()та .setDate()просто встановити частину дати.

Отже, щоб встановити дату закінчення на 2 тижні після дати початку, зробіть щось подібне:

function GetEndDate(startDate)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate()+14);
    return endDate;
}

Щоб повернути різницю (у днях) між двома датами, зробіть це:

function GetDateDiff(startDate, endDate)
{
    return endDate.getDate() - startDate.getDate();
}

Нарешті, давайте змінимо першу функцію, щоб вона могла приймати значення, повернене 2-ою, як параметр:

function GetEndDate(startDate, days)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate() + days);
    return endDate;
}

31
GetDateDiff()подолає місячні бар'єри. Наприклад, 2011/04/26 та 2011/05/01 повернеться -25, але компенсація має бути 5 днів.
nfm

var ds = нова дата (2014, 0, 31, 0, 0, 0, 0); var de = new Date (2014, 2, 31, 0, 0, 0, 0); GetDateDiff (ds, de) повернення 0
Noor

3

Дякую @ Вінсент Роберт , я в кінцевому підсумку використав твій основний приклад, хоча це насправді newBegin + oldEnd - oldBegin. Ось спрощене кінцеве рішення:

    // don't update end date if there's already an end date but not an old start date
    if (!oldEnd || oldBegin) {
        var selectedDateSpan = 1800000; // 30 minutes
        if (oldEnd) {
            selectedDateSpan = oldEnd - oldBegin;
        }

       newEnd = new Date(newBegin.getTime() + selectedDateSpan));
    }

1
Добре пояснити, чому ти іноді використовуєш, getTimeа іноді ні
Dan

2

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

// This one returns a signed decimal. The sign indicates past or future.

this.getDateDiff = function(date1, date2) {
    return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24);
}

// This one always returns a positive decimal. (Suggested by Koen below)

this.getDateDiff = function(date1, date2) {
    return Math.abs((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));
}

1
Поставте його в Math.abs()дзвінок, і ви завжди отримаєте позитивну десятку.
Коен.

1
Приємна пропозиція Коен. Це дає людям 2 варіанти: просто справжня дата відрізняється, як ви запропонували, або датований знак зі знаком, який вказує, чи є різниця в минулому чи майбутньому. :)
sparkyspider

Зауважте, що в JavaScript ви можете також додати / підрегулювати число в мілісекундах, date.getTime()щоб отримати час у майбутньому / минулому. `var nextMinute = нова дата (someDate.getTime () + 60 * 1000);
День

Це друкарська помилка? "між 2 днями". Можливо, між двома датами.
tomazahlin

2

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

moment(endDate).diff(moment(beginDate), 'days');

Додаткову інформацію можна знайти на сторінці moment.js

Ура, Мігель


1
function compare()
{
  var end_actual_time    = $('#date3').val();

  start_actual_time = new Date();
  end_actual_time = new Date(end_actual_time);

  var diff = end_actual_time-start_actual_time;

  var diffSeconds = diff/1000;
  var HH = Math.floor(diffSeconds/3600);
  var MM = Math.floor(diffSeconds%3600)/60;

  var formatted = ((HH < 10)?("0" + HH):HH) + ":" + ((MM < 10)?("0" + MM):MM)
  getTime(diffSeconds);
}
function getTime(seconds) {
  var days = Math.floor(leftover / 86400);

  //how many seconds are left
  leftover = leftover - (days * 86400);

  //how many full hours fits in the amount of leftover seconds
  var hours = Math.floor(leftover / 3600);

  //how many seconds are left
  leftover = leftover - (hours * 3600);

  //how many minutes fits in the amount of leftover seconds
  var minutes = leftover / 60;

  //how many seconds are left
  //leftover = leftover - (minutes * 60);
  alert(days + ':' + hours + ':' + minutes);
}

1

альтернативний модифікований розширений код ..

http://jsfiddle.net/vvGPQ/48/

showDiff();

function showDiff(){
var date1 = new Date("2013/01/18 06:59:00");   
var date2 = new Date();
//Customise date2 for your required future time

var diff = (date2 - date1)/1000;
var diff = Math.abs(Math.floor(diff));

var years = Math.floor(diff/(365*24*60*60));
var leftSec = diff - years * 365*24*60*60;

var month = Math.floor(leftSec/((365/12)*24*60*60));
var leftSec = leftSec - month * (365/12)*24*60*60;    

var days = Math.floor(leftSec/(24*60*60));
var leftSec = leftSec - days * 24*60*60;

var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;

var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;




document.getElementById("showTime").innerHTML = "You have " + years + " years "+ month + " month " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds the life time has passed.";

setTimeout(showDiff,1000);
}

Будь ласка, додайте додаткові роз'яснення до своєї відповіді та використовуйте кращу англійську мову.
Фонд позову Моніки

Це рішення неправильне, оскільки ви використовуєте 365 днів, нехтуючи високосними роками.
Сергій Голіней

0
function checkdate() {
    var indate = new Date()
    indate.setDate(dat)
    indate.setMonth(mon - 1)
    indate.setFullYear(year)

    var one_day = 1000 * 60 * 60 * 24
    var diff = Math.ceil((indate.getTime() - now.getTime()) / (one_day))
    var str = diff + " days are remaining.."
    document.getElementById('print').innerHTML = str.fontcolor('blue')
}

0
<html>
<head>
<script>
function dayDiff()
{
     var start = document.getElementById("datepicker").value;
     var end= document.getElementById("date_picker").value;
     var oneDay = 24*60*60*1000; 
     var firstDate = new Date(start);
     var secondDate = new Date(end);    
     var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    document.getElementById("leave").value =diffDays ;
 }
</script>
</head>
<body>
<input type="text" name="datepicker"value=""/>
<input type="text" name="date_picker" onclick="function dayDiff()" value=""/>
<input type="text" name="leave" value=""/>
</body>
</html>

0

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

він покаже результат числа років з дробом

function getStudyYears()
    {
        if(document.getElementById('txtFromQualifDate').value != '' && document.getElementById('txtQualifDate').value != '')
        {
            var d1 = document.getElementById('txtFromQualifDate').value;

            var d2 = document.getElementById('txtQualifDate').value;

            var one_day=1000*60*60*24;

            var x = d1.split("/");
            var y = d2.split("/");

            var date1=new Date(x[2],(x[1]-1),x[0]);

            var date2=new Date(y[2],(y[1]-1),y[0])

            var dDays = (date2.getTime()-date1.getTime())/one_day;

            if(dDays < 365)
            {
                alert("the date between start study and graduate must not be less than a year !");

                document.getElementById('txtQualifDate').value = "";
                document.getElementById('txtStudyYears').value = "";

                return ;
            }

            var dMonths = Math.ceil(dDays / 30);

            var dYears = Math.floor(dMonths /12) + "." + dMonths % 12;

            document.getElementById('txtStudyYears').value = dYears;
        }
    }

1
Ніколи не розбирайте рядки дати, щоб знайти рік, оскільки поява рядків (особливо роздільники) відрізняється між браузерами. Використання, getFullYearяке було призначене для цього. ------- Дивіться datejs бібліотеку на GoogleCode , які , можливо , підтримує більшість випадків кутку
Dan

дякую за пораду @Dan, але він працював і тестувався для мене на реальному проекті управління (різні браузери), чи це слабке програмування? :)
shareef

0

Якщо ви використовуєте об'єкти Date, а потім використовуєте getTime() функцію для обох дат, вона дасть вам їх відповідний час, починаючи з 1 січня 1970 року, у числовому значенні. Потім ви можете отримати різницю між цими числами.

Якщо це не допоможе вам, перегляньте повну документацію: http://www.w3schools.com/jsref/jsref_obj_date.asp


О, так, не помітили, відповіді нижче цього, як мінімум, півроку.
Коен.

0

Нижче коду повертаються дні, що залишилися від сьогодні, до ф'ючерсної дати.

Залежності: jQuery та MomentJs.

var getDaysLeft = function (date) {
  var today = new Date();
  var daysLeftInMilliSec = Math.abs(new Date(moment(today).format('YYYY-MM-DD')) - new Date(date));
  var daysLeft = daysLeftInMilliSec / (1000 * 60 * 60 * 24);   
  return daysLeft;
};

getDaysLeft('YYYY-MM-DD');

0
var getDaysLeft = function (date1, date2) {
   var daysDiffInMilliSec = Math.abs(new Date(date1) - new Date(date2));
   var daysLeft = daysDiffInMilliSec / (1000 * 60 * 60 * 24);   
   return daysLeft;
};
var date1='2018-05-18';
var date2='2018-05-25';
var dateDiff = getDaysLeft(date1, date2);
console.log(dateDiff);

0

Це те, на що я розпочав свою систему.

var startTime=("08:00:00").split(":");
var endTime=("16:00:00").split(":");
var HoursInMinutes=((parseInt(endTime[0])*60)+parseInt(endTime[1]))-((parseInt(startTime[0])*60)+parseInt(startTime[1]));
console.log(HoursInMinutes/60);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.