Получите разницу между двумя датами в 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>