Как узнать разницу между двумя датами в JavaScript?

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
114
0
143 311
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Ответ принят как подходящий

В 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)

Какой формат требуется для работы .getTime () ... Например - новая дата ('22 -12-2012 00:00 '). GetTime () не будет работать ... Есть идеи?

Jimmyt1988 18.09.2012 20:05

Для синтаксического анализа даты в JS я предлагаю вам взглянуть на этот вопрос: stackoverflow.com/questions/1576753/…

Vincent Robert 19.09.2012 16:13

Предполагается, что OldBegin, oldEnd и NewBegin являются объектами Date? Трудно сказать, к какому типу они должны относиться, поскольку объявление переменной здесь опущено.

Anderson Green 24.02.2013 21:52

Кроме того, есть функция, которую вы можете использовать для добавления или вычитания дат в JavaScript: stackoverflow.com/a/1214753/975097

Anderson Green 25.02.2013 08:02

Будьте осторожны с добавлением чисел и дней. См. Мой ответ ниже для объяснения

Dan 04.04.2013 16:24

Если вы используете объекты Date, а затем используете функцию getTime() для обеих дат, она предоставит вам соответствующее время с 1 января 1970 года в числовом значении. Затем вы можете увидеть разницу между этими числами.

Если это не поможет, ознакомьтесь с полной документацией: http://www.w3schools.com/jsref/jsref_obj_date.asp

Да, не заметил, ответы ниже этого не старше полугода.

Koen. 19.05.2012 17:26

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

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

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

GetDateDiff() преодолеет месячные барьеры. Например, 2011/04/26 и 2011/05/01 вернут -25, но смещение должно быть 5 дней.

nfm 26.04.2011 05:40

var ds = новая дата (2014, 0, 31, 0, 0, 0, 0); var de = новая дата (2014, 2, 31, 0, 0, 0, 0); GetDateDiff (ds, de) возвращает 0

Noor 22.04.2016 13:22

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

Это хороший момент, чтобы объяснить, почему вы иногда используете getTime, а иногда нет.

Dan 04.04.2013 16:22

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')
}

этот код заполняет продолжительность учебных лет, когда вы вводите дату начала и дату окончания (квалифицируемая дата) обучения и проверяете, если продолжительность меньше года, если да, предупреждение сообщение Имейте в виду, что есть три входных элемента: первый 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;
        }
    }

Никогда не анализируйте строки даты, чтобы найти год, потому что внешний вид строк (особенно разделители) различается в разных браузерах. Используйте getFullYear, который был разработан для этого. ------- См. Библиотеку datejs в googlecode, которая, возможно, поддерживает большинство угловых случаев.

Dan 04.04.2013 16:06

Спасибо за совет @Dan, но он работал и тестировался для меня на реальном правительственном проекте (в разных браузерах). Это слабая практика программирования? :)

shareef 04.04.2013 17:10

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

// 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));
}

Поместите его в вызов Math.abs(), и вы всегда получите положительное десятичное число.

Koen. 16.05.2012 18:26

Хорошее предложение, Коэн. Это дает людям 2 варианта: только истинную разницу дат, как вы предложили, или дату со знаком, указывающим, есть ли разница в прошлом или в будущем. :)

sparkyspider 18.05.2012 14:55

Обратите внимание, что в JavaScript вы также можете добавить / вычесть число в миллисекундах к date.getTime(), чтобы получить время в будущем / прошлом. `var nextMinute = новая дата (someDate.getTime () + 60 * 1000);

Dan 04.04.2013 16:30

Это опечатка? «между 2 днями». Наверное, между двумя свиданиями.

tomazahlin 16.08.2016 15:13

JavaScript отлично поддерживает разницу в дате прямо из коробки

https://jsfiddle.net/b9chris/v5twbe3h/

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.info(Math.floor((b - a) / msDay) + ' full days between'); // 364
console.info(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between'); // 0

Теперь о подводных камнях. Попробуй это:

console.info(a - 10); // 1331614798990
console.info(a + 10); // mixed string

Поэтому, если у вас есть риск добавить число и дату, конвертируйте Date в number напрямую.

console.info(a.getTime() - 10); // 1331614798990
console.info(a.getTime() + 10); // 1331614799010

Мой первый пример демонстрирует мощь объекта Date, но на самом деле он выглядит как бомба замедленного действия.

Дэн, мне показалось, что твой пример легче всего понять и последовать ему. Спасибо.

Melanie 30.07.2014 22:52

На самом деле "подводные камни" являются значениями по умолчанию, основанными на спецификации языка. Оператор вычитания - приводит аргументы к числу, поэтому Date возвращает значение времени. Оператор + перегружен, поэтому может выполнять сложение, принуждение к числу или конкатенацию. Поскольку в этом случае даты приводятся к String, + выполняет конкатенацию. Путаница не в объекте Date, а в операторах перегрузки.

RobG 23.03.2016 02:53

Я добавил jsfiddle и результаты вышеперечисленных строк кода в редактирование. Я также включил быстрый способ получить NaN: b + 60000 - a

Chris Moschini 15.10.2020 15:06

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);
}

См. 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>

Не все дни, когда наблюдается переход на летнее время, длится 24 часа. Использование встроенного синтаксического анализатора для анализа неподдерживаемого строкового формата - не лучший способ создать дату.

RobG 31.08.2020 01:16

альтернативная модификация расширенного кода ..

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);
}

Пожалуйста, добавьте дополнительные пояснения к своему ответу и лучше используйте английский.

Fund Monica's Lawsuit 12.05.2015 17:53

Это решение неверно, потому что вы используете 365 дней, пренебрегая високосными годами.

Sergey Goliney 03.03.2017 22:04

<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>

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

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

Дополнительную информацию можно найти в страница moment.js

Ваше здоровье, Мигель

Приведенный ниже код вернет количество дней, оставшихся с сегодняшнего дня до фьючерсной даты.

Зависимости: 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');

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.info(dateDiff);

ЭТО ЧТО Я СДЕЛАЛ НА СВОЕЙ СИСТЕМЕ.

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.info(HoursInMinutes/60);

Другие вопросы по теме