Станом на це написання, лише одна з інших відповідей правильно обробляє переходи DST (літній час). Ось результати системи, розташованої в Каліфорнії:
1/1/2013- 3/10/2013- 11/3/2013-
User Formula 2/1/2013 3/11/2013 11/4/2013 Result
--------- --------------------------- -------- --------- --------- ---------
Miles (d2 - d1) / N 31 0.9583333 1.0416666 Incorrect
some Math.floor((d2 - d1) / N) 31 0 1 Incorrect
fuentesjr Math.round((d2 - d1) / N) 31 1 1 Correct
toloco Math.ceiling((d2 - d1) / N) 31 1 2 Incorrect
N = 86400000
Хоча Math.round
повертає правильні результати, я думаю, що це дещо незграбно. Натомість, чітко враховуючи зміни в зміщенні UTC, коли починається або закінчується DST, ми можемо використовувати точну арифметику:
function treatAsUTC(date) {
var result = new Date(date);
result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
return result;
}
function daysBetween(startDate, endDate) {
var millisecondsPerDay = 24 * 60 * 60 * 1000;
return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}
alert(daysBetween($('#first').val(), $('#second').val()));
Пояснення
Обчислення дати JavaScript складні, оскільки Date
об’єкти зберігають час усередині UTC, а не місцевий час. Наприклад, 3.10.2013 00:00 тихоокеанський стандартний час (UTC-08: 00) зберігається як 10.10.2013 8:00 UTC, а 11.11.2013 00:00 тихоокеанський літній час ( UTC-07: 00) зберігається як 11.11.2013 7:00 за UTC. У цей день з півночі до півночі місцевий час у UTC лише 23 години!
Хоча день за місцевим часом може мати більше або менше 24 годин, день у UTC завжди рівно 24 години. 1daysBetween
спосіб , показаний вище , використовує цей факт першого виклику , treatAsUTC
щоб налаштувати як місцевий час до півночі UTC до віднімання і ділення.
1. JavaScript ігнорує високосні секунди.