Получите разницу между двумя датами в JavaScript?

Как мне получить разницу между двумя датами в полный рабочий день (я не хочу никаких долей дня)

var date1 = new Date('7/11/2010');
var date2 = new Date('12/12/2010');
var diffDays = date2.getDate() - date1.getDate(); 
alert(diffDays)

Я попробовал это, но это не сработало.

Ответ 1

Вот один из способов:

var date1 = new Date("7/13/2010");
var date2 = new Date("12/15/2010");
var timeDiff = Math.abs(date2.getTime() - date1.getTime());
var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)); 
alert(diffDays);

Обратите внимание, что нам нужно заключить дату в кавычки. Остальная часть кода получает разницу во времени в миллисекундах, а затем делится на количество дней. Дата ожидает формат mm/dd/yyyy.

Ответ 2

Более правильное решение

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

Предыдущие ответы на этот вопрос не учитывают случаи, когда эти две даты относятся к изменению летнего времени (DST). Дата, на которую происходит изменение DST, будет иметь длительность в миллисекундах, которая равна != 1000*60*60*24, поэтому типичный расчет не будет выполнен.

Вы можете обойти это, сначала нормализуя две даты в UTC, а затем вычислив разницу между этими двумя датами UTC.

Теперь решение можно записать в виде

var _MS_PER_DAY = 1000 * 60 * 60 * 24;
var a    = new Date();
var b    = new Date("2017-07-25"); // Or any other JS date

var remainingDays    = dateDiffInDays(a, b);

if (remainingDays > 0 ) { // Apply you login on remaining days
}

// a and b are javascript Date objects
function dateDiffInDays(a, b) {
  // Discard the time and time-zone information.
  var utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
  var utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());

  return Math.floor((utc2 - utc1) / _MS_PER_DAY);
}

Это работает, потому что время UTC никогда не замечает DST. См. Наблюдает ли UTC летнее время?

p.s. Обсудив некоторые комментарии к этому ответу, как только вы поняли проблемы с датами javascript, которые охватывают границу DST, скорее всего, есть только один способ ее решения. То, что я предоставил выше, является простым (и проверенным) решением. Мне было бы интересно узнать, есть ли простое решение для арифметики/математики вместо того, чтобы создавать два новых объекта Date. Это может быть быстрее.

Ответ 3

Вот решение, использующее moment.js:

var a = moment('7/11/2010','M/D/YYYY');
var b = moment('12/12/2010','M/D/YYYY');
var diffDays = b.diff(a, 'days');
alert(diffDays);

Я использовал ваши исходные значения ввода, но вы не указали формат, поэтому я предположил, что первое значение было 11 июля. Если он должен был быть 7 ноября, тогда измените формат на D/M/YYYY.

Ответ 4

var date1 = new Date("7/11/2010");
var date2 = new Date("8/11/2010");
var diffDays = parseInt((date2 - date1) / (1000 * 60 * 60 * 24)); 

alert(diffDays )

Ответ 5

Я пробовал много способов и обнаружил, что использование datepicker было лучшим, но формат даты вызывает проблемы с JavaScript....

Итак, вот мой ответ и может быть исчерпан.

<input type="text" id="startdate">
<input type="text" id="enddate">
<input type="text" id="days">

<script src="https://code.jquery.com/jquery-1.8.3.js"></script>
<script src="https://code.jquery.com/ui/1.10.0/jquery-ui.js"></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/redmond/jquery-ui.css" />
<script>
$(document).ready(function() {

$( "#startdate,#enddate" ).datepicker({
changeMonth: true,
changeYear: true,
firstDay: 1,
dateFormat: 'dd/mm/yy',
})

$( "#startdate" ).datepicker({ dateFormat: 'dd-mm-yy' });
$( "#enddate" ).datepicker({ dateFormat: 'dd-mm-yy' });

$('#enddate').change(function() {
var start = $('#startdate').datepicker('getDate');
var end   = $('#enddate').datepicker('getDate');

if (start<end) {
var days   = (end - start)/1000/60/60/24;
$('#days').val(days);
}
else {
alert ("You cant come back before you have been!");
$('#startdate').val("");
$('#enddate').val("");
$('#days').val("");
}
}); //end change function
}); //end ready
</script>

Скрипт можно увидеть здесь DEMO

Ответ 6

Это код для вычитания одной даты из другой. Этот пример преобразует даты в объекты, поскольку функция getTime() не будет работать, если это не объект Date.

    var dat1 = document.getElementById('inputDate').value;
                var date1 = new Date(dat1)//converts string to date object
                alert(date1);
                var dat2 = document.getElementById('inputFinishDate').value;
                var date2 = new Date(dat2)
                alert(date2);

                var oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds
                var diffDays = Math.abs((date1.getTime() - date2.getTime()) / (oneDay));
                alert(diffDays);

Ответ 7

var date1 = new Date(2014,1,15); 
var date2 = new Date(2015,1,15);
var timeDiff = Math.abs(date2.getTime() - date1.getTime());
var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)); 
alert(diffDays);

Демо: http://jsfiddle.net/PUSQU/23/

Ответ 8

1000000% уверен...............

 <script>
    function myFunction() {
        var date1=new Date();// for current date
        var date2 =new Date("Sep, 30, 2015");

         // for other date you can get the another date from a textbox by
         // var Newdate=document.getElementById('<%=textBox1.ClientID%>').value;
         // convert Newdate to dateTime by......   var date2=New Date(Newdate);

        var yearDiff=date1.getFullYear()-date2.getFullYear();// for year difference
        var y1=date1.getFullYear();
        var y2=date2.getFullYear();
        var monthDiff=(date1.getMonth() + y1*12)-(date2.getMonth() +y2*12);
        var day1=parseInt(date1.getDate());
        var day2=parseInt(date2.getDate());
        var dayDiff= (day1-day2)+ (monthDiff * 30);
    document.write("Number of day difference : "+dayDiff);
    }
    </script>