Как узнать количество дней между двумя датами в JavaScript? - PullRequest
353 голосов
/ 12 февраля 2009

Как узнать количество дней между двумя датами в JavaScript? Например, в полях ввода указаны две даты:

<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

<script>
  alert(datediff("day", first, second)); // what goes here?
</script>

Ответы [ 35 ]

7 голосов
/ 13 июля 2016

Можно рассчитать разницу дней полного доказательства между двумя датами, расположенными в разных TZ, используя следующую формулу:

var start = new Date('10/3/2015');
var end = new Date('11/2/2015');
var days = (end - start) / 1000 / 60 / 60 / 24;
console.log(days);
// actually its 30 ; but due to daylight savings will show 31.0xxx
// which you need to offset as below
days = days - (end.getTimezoneOffset() - start.getTimezoneOffset()) / (60 * 24);
console.log(days);
6 голосов
/ 27 марта 2013

Я нашел этот вопрос, когда хочу вычислить две даты, но у даты есть значение часов и минут, я изменил ответ @ michael-liu, чтобы он соответствовал моим требованиям, и он прошел мой тест.

разность дней 2012-12-31 23:00 и 2013-01-01 01:00 должны равняться 1. (2 часа) разность дней 2012-12-31 01:00 и 2013-01-01 23:00 должна равняться 1. (46 часов)

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

var millisecondsPerDay = 24 * 60 * 60 * 1000;
function diffDays(startDate, endDate) {
    return Math.floor(treatAsUTC(endDate) / millisecondsPerDay) - Math.floor(treatAsUTC(startDate) / millisecondsPerDay);
}
6 голосов
/ 15 марта 2012

Я думаю, что решения не верны 100% Я бы использовал ceil вместо floor , раунд будет работать, но это неправильная операция.

function dateDiff(str1, str2){
    var diff = Date.parse(str2) - Date.parse(str1); 
    return isNaN(diff) ? NaN : {
        diff: diff,
        ms: Math.ceil(diff % 1000),
        s: Math.ceil(diff / 1000 % 60),
        m: Math.ceil(diff / 60000 % 60),
        h: Math.ceil(diff / 3600000 % 24),
        d: Math.ceil(diff / 86400000)
    };
}
5 голосов
/ 12 февраля 2009

Как насчет использования formatDate из виджета DatePicker? Вы можете использовать его для преобразования дат в формат отметки времени (миллисекунды с 01.01.1970), а затем выполнить простое вычитание.

5 голосов
/ 21 ноября 2016
var start= $("#firstDate").datepicker("getDate");
var end= $("#SecondDate").datepicker("getDate");
var days = (end- start) / (1000 * 60 * 60 * 24);
 alert(Math.round(days));

jsfiddle пример:)

5 голосов
/ 22 января 2017

function timeDifference(date1, date2) {
  var oneDay = 24 * 60 * 60; // hours*minutes*seconds
  var oneHour = 60 * 60; // minutes*seconds
  var oneMinute = 60; // 60 seconds
  var firstDate = date1.getTime(); // convert to milliseconds
  var secondDate = date2.getTime(); // convert to milliseconds
  var seconds = Math.round(Math.abs(firstDate - secondDate) / 1000); //calculate the diffrence in seconds
  // the difference object
  var difference = {
    "days": 0,
    "hours": 0,
    "minutes": 0,
    "seconds": 0,
  }
  //calculate all the days and substract it from the total
  while (seconds >= oneDay) {
    difference.days++;
    seconds -= oneDay;
  }
  //calculate all the remaining hours then substract it from the total
  while (seconds >= oneHour) {
    difference.hours++;
    seconds -= oneHour;
  }
  //calculate all the remaining minutes then substract it from the total 
  while (seconds >= oneMinute) {
    difference.minutes++;
    seconds -= oneMinute;
  }
  //the remaining seconds :
  difference.seconds = seconds;
  //return the difference object
  return difference;
}
console.log(timeDifference(new Date(2017,0,1,0,0,0),new Date()));
4 голосов
/ 02 декабря 2014

Date.prototype.days = function(to) {
  return Math.abs(Math.floor(to.getTime() / (3600 * 24 * 1000)) - Math.floor(this.getTime() / (3600 * 24 * 1000)))
}


console.log(new Date('2014/05/20').days(new Date('2014/05/23'))); // 3 days

console.log(new Date('2014/05/23').days(new Date('2014/05/20'))); // 3 days
4 голосов
/ 02 апреля 2015

Возможно, это не самое элегантное решение, но, кажется, оно отвечает на вопрос относительно простым кусочком кода. Разве вы не можете использовать что-то вроде этого:

function dayDiff(startdate, enddate) {
  var dayCount = 0;

  while(enddate >= startdate) {
    dayCount++;
    startdate.setDate(startdate.getDate() + 1);
  }

return dayCount; 
}

Предполагается, что вы передаете объекты даты в качестве параметров.

4 голосов
/ 20 сентября 2016

Будьте осторожны, когда использует миллисекунды .

date.getTime () возвращает миллисекунды, а для выполнения математической операции с миллисекундами необходимо включить

  • Летнее время (DST)
  • проверка, имеют ли обе даты одинаковое время (часы, минуты, секунды, миллисекунды)
  • убедитесь, что требуется поведение различий в днях: 19 сентября 2016 г. - 29 сентября 2016 г. = разница в 1 или 2 дня?

Пример из комментария выше - лучшее решение, которое я нашел до сих пор https://stackoverflow.com/a/11252167/2091095. Но используйте + 1 для его результата, если вы хотите, чтобы считать все вовлеченные дни.

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

var diff = daysBetween($('#first').val(), $('#second').val()) + 1;
3 голосов
/ 16 декабря 2015

Если у вас есть две временные метки Unix, вы можете использовать эту функцию (для большей ясности сделана более подробной):

// Calculate number of days between two unix timestamps
// ------------------------------------------------------------
var daysBetween = function(timeStampA, timeStampB) {
    var oneDay = 24 * 60 * 60 * 1000; // hours * minutes * seconds * milliseconds
    var firstDate = new Date(timeStampA * 1000);
    var secondDate = new Date(timeStampB * 1000);
    var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    return diffDays;
};

Пример:

daysBetween(1096580303, 1308713220); // 2455
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...