Как я могу получить разницу между двумя датами в JavaScript? - PullRequest
102 голосов
/ 03 сентября 2008

Я создаю приложение, которое позволяет вам определять события с временными рамками. Я хочу автоматически заполнить дату окончания, когда пользователь выбирает или изменяет дату начала. Однако я не могу понять, как получить разницу между этими двумя значениями и как создать новую дату окончания, используя эту разницу.

Ответы [ 16 ]

68 голосов
/ 03 сентября 2008

В JavaScript даты могут быть преобразованы в число миллисекунд с момента epoc, вызвав метод getTime() или , просто используя дату в числовом выражении.

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

Чтобы создать новую дату на основе разницы, просто укажите количество миллисекунд в конструкторе.

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

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

Это должно просто сработать

РЕДАКТИРОВАТЬ : исправлена ​​ошибка, указанная @ bdukes

РЕДАКТИРОВАТЬ :

Для объяснения поведения oldBegin, oldEnd и newBegin являются Date экземплярами. Вызов операторов + и - вызовет автоматическое приведение Javascript и автоматически вызовет метод-прототип valueOf() этих объектов. Бывает, что метод valueOf() реализован в объекте Date как вызов getTime().

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

20 голосов
/ 04 апреля 2013

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 голосов
/ 30 июля 2014

См. 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 голосов
/ 03 сентября 2008

Если вам не важен компонент времени, вы можете использовать .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();
}

Наконец, давайте изменим первую функцию, чтобы она могла принимать значение, возвращаемое 2nd как параметр:

function GetEndDate(startDate, days)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate() + days);
    return endDate;
}
3 голосов
/ 03 сентября 2008

Спасибо @ Винсент Роберт , я остановился на вашем базовом примере, хотя на самом деле это 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));
    }
2 голосов
/ 30 мая 2016

При использовании moment.js есть более простое решение, которое даст вам разницу в днях в одной строке кода.

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

Дополнительные подробности можно найти на странице moment.js

Ура, Miguel

2 голосов
/ 10 мая 2012

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

// 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 голос
/ 15 ноября 2013
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);
}
0 голосов
/ 24 мая 2018

Это то, что я сделал в моей системе.

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);
0 голосов
/ 18 мая 2018
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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...