Как получить разницу количества дней, вычисляя две даты, используя javascript [duplicate]

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

  var char = String.fromCharCode (v_code);   

Оттуда я добавлю символ в строку, а при нажатии клавиши ввода отправьте строку на сервер. Извините, если мой вопрос казался несколько загадочным, а название означало что-то почти полностью вне темы, рано утром, и я еще не завтракал;).

Спасибо за вашу помощь ребята.

300
задан Michael Haren 14 May 2013 в 19:13
поделиться

30 ответов

Вот быстрая и грязная реализация datediff, как доказательство концепции для решения проблемы, представленной в вопросе. Он полагается на то, что вы можете получить истекшие миллисекунды между двумя датами, вычитая их, что приводит их к их примитивному значению числа (миллисекунды с начала 1970 года).

// new Date("dateString") is browser-dependent and discouraged, so we'll write
// a simple parse function for U.S. date format (which does no error checking)
function parseDate(str) {
    var mdy = str.split('/');
    return new Date(mdy[2], mdy[0]-1, mdy[1]);
}

function datediff(first, second) {
    // Take the difference between the dates and divide by milliseconds per day.
    // Round to nearest whole number to deal with DST.
    return Math.round((second-first)/(1000*60*60*24));
}

alert(datediff(parseDate(first.value), parseDate(second.value)));
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

Вы должны знать, что «нормальные» API дат (без «UTC» в имени) работают в локальный часовой пояс браузера пользователя, поэтому в целом вы можете столкнуться с проблемами, если ваш пользователь находится в часовом поясе, которого вы не ожидаете, и вашему коду придется иметь дело с переходами на летнее время. Вы должны внимательно прочитать документацию для объекта Date и его методов и для чего-либо более сложного, настоятельно рекомендуем использовать библиотеку, которая предлагает более безопасные и мощные API для обработки дат.

Также, для иллюстрации, фрагмент использует именованный доступ к объекту window для краткости, но в процессе производства вы должны использовать стандартизированные API, такие как getElementById или, более вероятно, некоторые рамки пользовательского интерфейса.

323
ответ дан Miles 17 August 2018 в 09:35
поделиться
  • 1
    Я думаю, что Math.trunc () более уместен. На всякий случай кто-то использует более точные объекты Date (например, часы, минуты и секунды) – Jin Wang 6 July 2016 в 19:46
  • 2
    Поскольку ответ, который отмечен как правильный и самый высокий голос (на данный момент), стоит прокомментировать, что этот ответ неправильно обрабатывает летнее время. См. Ответ Майкла Лю. – osullic 21 September 2016 в 00:01
  • 3
    Что делает parseDate в точности? – M98 27 November 2016 в 10:15
  • 4
    @ osullic - этот ответ обрабатывает переход на летнее время с Math.round , однако он ожидает, что будет передан только строки, а не дата и время. – RobG 17 February 2017 в 02:00
  • 5
    @ M98 - это вспомогательная функция, обеспечивающая правильную обработку строки даты. Очень разумно не полагаться на конструктор Date или Date.parse для синтаксического анализа. – RobG 17 February 2017 в 02:08
var start= $("#firstDate").datepicker("getDate");
var end= $("#SecondDate").datepicker("getDate");
var days = (end- start) / (1000 * 60 * 60 * 24);
 alert(Math.round(days));

Пример jsfiddle :)

5
ответ дан Aravindh Gopi 17 August 2018 в 09:35
поделиться

Я бы пошел, и захватил эту небольшую утилиту , и в ней вы найдете функции для этого. Вот краткий пример:

        <script type="text/javascript" src="date.js"></script>
        <script type="text/javascript">
            var minutes = 1000*60;
            var hours = minutes*60;
            var days = hours*24;

            var foo_date1 = getDateFromFormat("02/10/2009", "M/d/y");
            var foo_date2 = getDateFromFormat("02/12/2009", "M/d/y");

            var diff_date = Math.round((foo_date2 - foo_date1)/days);
            alert("Diff date is: " + diff_date );
        </script>
40
ответ дан fuentesjr 17 August 2018 в 09:35
поделиться

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

diff days 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
ответ дан guilin 桂林 17 August 2018 в 09:35
поделиться

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

6
ответ дан kgiannakakis 17 August 2018 в 09:35
поделиться

Начиная с этой записи, только один из других ответов правильно обрабатывает переходы 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 12:00 AM Тихоокеанское стандартное время (UTC-08: 00) хранится как 3/10/2013 8:00 AM UTC и 3/11/2013 12:00 AM Pacific Daylight Time ( UTC-07: 00) хранится как 3/11/2013 7:00 UTC. В этот день, полуночи до полуночи по местному времени - всего 23 часа в UTC!

Хотя день в местное время может иметь более или менее 24 часов, в режиме UTC всегда будет ровно 24 часа.1 Метод daysBetween, показанный выше, использует этот факт, сначала позвонив treatAsUTC, чтобы отрегулировать оба местных времени до полуночи UTC, прежде чем вычитать и делить.

1. JavaScript игнорирует секунды прыжка.

179
ответ дан Michael Liu 17 August 2018 в 09:35
поделиться
  • 1
    Нет необходимости использовать UTC, это нормально, чтобы установить местные часы до полуночи (или то же значение для обеих дат). Дробный день, введенный с помощью летнего времени, составляет всего ± 0,04 (и в некоторых местах меньше), поэтому он округляется с Math.round . ;-) Опираясь на конструктор Date для синтаксического анализа строк, это не очень хорошая идея. Если вы действительно хотите использовать значения UTC, сначала проанализируйте строки, используя Date.UTC(...). – RobG 17 February 2017 в 02:07
  • 2
    @RobG: Как я сказал в своем ответе: «Хотя Math.round возвращает правильные результаты, я думаю, что это несколько неуклюжие. Вместо этого, явно учитывая изменения смещения UTC, когда DST начинается или заканчивается, мы можем использовать точную арифметику. & Quot; – Michael Liu 17 February 2017 в 02:21

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

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

8
ответ дан mplungjan 17 August 2018 в 09:35
поделиться

Значения даты в JS являются значениями даты и времени.

Итак, прямые вычисления даты непоследовательны:

(2013-11-05 00:00:00) - (2013-11-04 10:10:10) < 1 day

, например, нам нужно преобразовать вторую дату:

(2013-11-05 00:00:00) - (2013-11-04 00:00:00) = 1 day

метод может обрезать мельницы в обеих датах:

var date1 = new Date('2013/11/04 00:00:00');
var date2 = new Date('2013/11/04 10:10:10'); //less than 1
var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);

date2 = new Date('2013/11/05 00:00:00'); //1

var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);

12
ответ дан Ruslan López 17 August 2018 в 09:35
поделиться
  • 1
    moment.js действительно удобен для таких вещей, как YTD diff count var now = moment(), yearStart = moment().startOf('year'); var ytdDays = now.diff(yearStart, 'days'); // this can be years, months, weeks, days, hours, minutes, and seconds console.log(ytdDays); здесь: momentjs.com – Sharif 12 July 2017 в 21:04

Самый простой способ получить разницу между двумя датами:

var diff =  Math.floor(( Date.parse(str2) - Date.parse(str1) ) / 86400000); 

Вы получаете разницу дней (или NaN, если один или оба не могут быть проанализированы). Дата синтаксического анализа дала результат в миллисекундах, и чтобы получить его днем, вы должны разделить его на 24 * 60 * 60 * 1000

. Если вы хотите, чтобы он делился на дни, часы, минуты, секунды и миллисекунды:

function dateDiff( str1, str2 ) {
    var diff = Date.parse( str2 ) - Date.parse( str1 ); 
    return isNaN( diff ) ? NaN : {
        diff : diff,
        ms : Math.floor( diff            % 1000 ),
        s  : Math.floor( diff /     1000 %   60 ),
        m  : Math.floor( diff /    60000 %   60 ),
        h  : Math.floor( diff /  3600000 %   24 ),
        d  : Math.floor( diff / 86400000        )
    };
}

Вот моя рефакторинговая версия версии Джеймса:

function mydiff(date1,date2,interval) {
    var second=1000, minute=second*60, hour=minute*60, day=hour*24, week=day*7;
    date1 = new Date(date1);
    date2 = new Date(date2);
    var timediff = date2 - date1;
    if (isNaN(timediff)) return NaN;
    switch (interval) {
        case "years": return date2.getFullYear() - date1.getFullYear();
        case "months": return (
            ( date2.getFullYear() * 12 + date2.getMonth() )
            -
            ( date1.getFullYear() * 12 + date1.getMonth() )
        );
        case "weeks"  : return Math.floor(timediff / week);
        case "days"   : return Math.floor(timediff / day); 
        case "hours"  : return Math.floor(timediff / hour); 
        case "minutes": return Math.floor(timediff / minute);
        case "seconds": return Math.floor(timediff / second);
        default: return undefined;
    }
}
104
ответ дан some 17 August 2018 в 09:35
поделиться

Я рекомендую использовать библиотеку moment.js ( http://momentjs.com/docs/#/displaying/difference/ ).

Пример:

var start = moment("2013-11-03");
var end = moment("2013-11-04");
end.diff(start, "days")
1
72
ответ дан stephenbez 17 August 2018 в 09:35
поделиться
  • 1
    Точно так же, как предупреждение в то время как momentjs велико, это довольно большая зависимость – Jason Axelson 3 December 2016 в 01:16
  • 2
    Это действительно должно быть end.diff(start,"days"), хотя код, написанный, будет работать, потому что дата начала после даты окончания! – gordon613 28 June 2017 в 11:09

Лучше избавиться от DST, Math.ceil, Math.floor и т. д., используя время UTC:

var firstDate = Date.UTC(2015,01,2);
var secondDate = Date.UTC(2015,04,22);
var diff = Math.abs((firstDate.valueOf() 
    - secondDate.valueOf())/(24*60*60*1000));

Этот пример дает разницу 109 дней. 24*60*60*1000 - один день в миллисекундах.

7
ответ дан Timo Kähkönen 17 August 2018 в 09:35
поделиться

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

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)
    };
}
6
ответ дан Tolo Palmer 17 August 2018 в 09:35
поделиться
  • 1
    Дни могут иметь более 24 часов и минут, может иметь более 60 секунд. Использование Math.ceil () приведет к перерасчету в этих случаях. – Rich Dougherty 7 April 2012 в 23:28

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

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;
4
ответ дан Community 17 August 2018 в 09:35
поделиться

Другие варианты ответов в закладке, в которых указаны обе даты:

javascript:(function() {
    var d = new Date(prompt("First Date or leave blank for today?") || Date.now());
    prompt("Days Between", Math.round(
        Math.abs(
            (d.getTime() - new Date(prompt("Date 2")).getTime())
                /(24*60*60*1000)
             )
        ));
})();
0
ответ дан drzaus 17 August 2018 в 09:35
поделиться

Если вы хотите, чтобы решение, которое работает как time.js, отвечает без накладных расходов библиотеки, вы можете использовать этот компонент , который я написал.

Для получения дней:

var date1 = new Date('January 24, 1984 09:41:00');
var date2 = new Date('June 29, 2007 18:45:10');

var numDays = dateDiff(date1, date2, 'days');

В дополнение к вычислению количества дней между двумя датами он также может рассчитать все остальные стандартные единицы времени (секунды, часы, недели, месяцы и т. д.).

Использовать метод dateDiff () вы можете импортировать компонент.

1
ответ дан Gideon Shils 17 August 2018 в 09:35
поделиться
const startDate = '2017-11-08';
const endDate   = '2017-10-01';
const timeDiff  = (new Date(startDate)) - (new Date(endDate));
const days      = timeDiff / (1000 * 60 * 60 * 24)
  1. Установить дату начала
  2. Установить конечную дату
  3. Рассчитать разницу
  4. Преобразовать миллисекунды в дни
3
ответ дан marcobiedermann 17 August 2018 в 09:35
поделиться

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
ответ дан mplungjan 17 August 2018 в 09:35
поделиться
  • 1
    Могу ли я попросить вас, пожалуйста, добавить еще немного контекста вокруг вашего ответа. Кодовые ответы трудно понять. Это поможет читателю и будущим читателям, если вы сможете добавить дополнительную информацию в свой пост. – RBT 22 January 2017 в 01:13
  • 2
    я хотел редактировать, но я получал ошибки, я мог бы отправить редактирование :(. – N.Belhadj 22 January 2017 в 17:15
  • 3
    @ N.Belhadj вы можете заменить все эти циклы с помощью простых операций div и mod (%) – Mihail Shishkov 24 May 2017 в 16:46

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

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

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

return dayCount; 
}

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

3
ответ дан Popmatic 17 August 2018 в 09:35
поделиться

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

var startDate= new Date("Mon Jan 01 2007 11:00:00");
var endDate  =new Date("Tue Jan 02 2007 12:50:00");
var timeStart = startDate.getTime();
var timeEnd = endDate.getTime();
var yearStart = startDate.getFullYear();
var yearEnd   = endDate.getFullYear();
if(yearStart == yearEnd)
 {
  var hourDiff = timeEnd - timeStart; 
  var secDiff = hourDiff / 1000;
  var minDiff = hourDiff / 60 / 1000; 
  var hDiff = hourDiff / 3600 / 1000; 
  var myObj = {};
  myObj.hours = Math.floor(hDiff);
  myObj.minutes = minDiff  
  if(myObj.hours >= 24)
   {
    console.log(Math.floor(myObj.hours/24) + "day(s) ago")
   } 
 else if(myObj.hours>0)
  {
   console.log(myObj.hours +"hour(s) ago")
  }
 else
  {
   console.log(Math.abs(myObj.minutes) +"minute(s) ago")
  }
}
else
{
var yearDiff = yearEnd - yearStart;
console.log( yearDiff +" year(s) ago");
}
3
ответ дан Ramees Rahath 17 August 2018 в 09:35
поделиться
  • 1
    Пожалуйста, объясните свой код, и вы решили проблему, просто вставить код считается плохим ответом. – Marco Scabbiolo 21 July 2016 в 13:51
  • 2
    Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст в отношении how и / или why , он решает проблему, улучшит долгосрочную ценность ответа. – Michael Parker 21 July 2016 в 16:47
  • 3
    Спасибо @ MarcoScabbiolo, @ Michael Parker за комментарии. Поскольку я новичок в Stackoverflow с точки зрения ответа, я не знал о том, как следует разделить решение – Ramees Rahath 22 July 2016 в 16:07

, если вы хотите иметь DateArray с датами, попробуйте это:

<script>
        function getDates(startDate, stopDate) {
        var dateArray = new Array();
        var currentDate = moment(startDate);
        dateArray.push( moment(currentDate).format('L'));

        var stopDate = moment(stopDate);
        while (dateArray[dateArray.length -1] != stopDate._i) {
            dateArray.push( moment(currentDate).format('L'));
            currentDate = moment(currentDate).add(1, 'days');
        }
        return dateArray;
      }
</script>

DebugSnippet

3
ответ дан Ricardo Fercher 17 August 2018 в 09:35
поделиться

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
ответ дан Ruslan López 17 August 2018 в 09:35
поделиться

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

var firstDate= new Date(firstDate.setHours(0,0,0,0));
var secondDate= new Date(secondDate.setHours(0,0,0,0));
var timeDiff = firstDate.getTime() - secondDate.getTime();
var diffDays =timeDiff / (1000 * 3600 * 24);
2
ответ дан Sriman Pathy 17 August 2018 в 09:35
поделиться

Лучшее решение

Игнорирование временной части

возвращает 0, если обе даты одинаковы.

function dayDiff(firstDate, secondDate) {
  firstDate = new Date(firstDate);
  secondDate = new Date(secondDate);
  if (!isNaN(firstDate) && !isNaN(secondDate)) {
    firstDate.setHours(0, 0, 0, 0); //ignore time part
    secondDate.setHours(0, 0, 0, 0); //ignore time part
    var dayDiff = secondDate - firstDate;
    dayDiff = dayDiff / 86400000; // divide by milisec in one day
    console.log(dayDiff);
  } else {
    console.log("Enter valid date.");
  }
}

$(document).ready(function() {
  $('input[type=datetime]').datepicker({
    dateFormat: "mm/dd/yy",
    changeMonth: true,
    changeYear: true
  });
  $("#button").click(function() {
    dayDiff($('#first').val(), $('#second').val());
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<input type="datetime" id="first" value="12/28/2016" />
<input type="datetime" id="second" value="12/28/2017" />
<input type="button" id="button" value="Calculate">

1
ответ дан Sumit Joshi 17 August 2018 в 09:35
поделиться

Вы можете использовать UnderscoreJS для форматирования и вычисления разницы.

Демо https://jsfiddle.net/sumitridhal/8sv94msp/

 var startDate = moment("2016-08-29T23:35:01");
var endDate = moment("2016-08-30T23:35:01");  
  

console.log(startDate);
console.log(endDate);

var resultHours = endDate.diff(startDate, 'hours', true);

document.body.innerHTML = "";
document.body.appendChild(document.createTextNode(resultHours));
body { white-space: pre; font-family: monospace; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>

0
ответ дан Sumit Ridhal 17 August 2018 в 09:35
поделиться
   function validateDate() {
        // get dates from input fields
        var startDate = $("#startDate").val();
        var endDate = $("#endDate").val();
        var sdate = startDate.split("-");
        var edate = endDate.split("-");
        var diffd = (edate[2] - sdate[2]) + 1;
        var leap = [ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        var nonleap = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        if (sdate[0] > edate[0]) {
            alert("Please enter End Date Year greater than Start Date Year");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[1] > edate[1]) {
            alert("Please enter End Date month greater than Start Date month");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[2] > edate[2]) {
            alert("Please enter End Date greater than Start Date");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else {
            if (sdate[0] / 4 == 0) {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + leap[sdate[1]++];
                }
            } else {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + nonleap[sdate[1]++];
                }
            }
            document.getElementById("numberOfDays").value = diffd;
        }
    }
0
ответ дан TotPeRo 17 August 2018 в 09:35
поделиться

У меня была такая же проблема в Angular. Я делаю копию, потому что иначе он перезапишет первое свидание. Обе даты должны иметь время 00:00:00 (очевидно)

 /*
* Deze functie gebruiken we om het aantal dagen te bereken van een booking.
* */
$scope.berekenDagen = function ()
{
    $scope.booking.aantalDagen=0;

    /*De loper is gelijk aan de startdag van je reservatie.
     * De copy is nodig anders overschijft angular de booking.van.
     * */
    var loper = angular.copy($scope.booking.van);

    /*Zolang de reservatie beschikbaar is, doorloop de weekdagen van je start tot einddatum.*/
    while (loper < $scope.booking.tot) {
        /*Tel een dag op bij je loper.*/
        loper.setDate(loper.getDate() + 1);
        $scope.booking.aantalDagen++;
    }

    /*Start datum telt natuurlijk ook mee*/
    $scope.booking.aantalDagen++;
    $scope.infomsg +=" aantal dagen: "+$scope.booking.aantalDagen;
};
3
ответ дан user3806549 17 August 2018 в 09:35
поделиться

Если у вас есть две временные метки 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
3
ответ дан Wallace Sidhrée 17 August 2018 в 09:35
поделиться
function formatDate(seconds, dictionary) {
    var foo = new Date;
    var unixtime_ms = foo.getTime();
    var unixtime = parseInt(unixtime_ms / 1000);
    var diff = unixtime - seconds;
    var display_date;
    if (diff <= 0) {
        display_date = dictionary.now;
    } else if (diff < 60) {
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.second;
        } else {
            display_date = diff + ' ' + dictionary.seconds;
        }
    } else if (diff < 3540) {
        diff = Math.round(diff / 60);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.minute;
        } else {
            display_date = diff + ' ' + dictionary.minutes;
        }
    } else if (diff < 82800) {
        diff = Math.round(diff / 3600);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.hour;
        } else {
            display_date = diff + ' ' + dictionary.hours;
        }
    } else {
        diff = Math.round(diff / 86400);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.day;
        } else {
            display_date = diff + ' ' + dictionary.days;
        }
    }
    return display_date;
}
2
ответ дан zloctb 17 August 2018 в 09:35
поделиться

Чтобы подсчитать дни между двумя заданными датами, вы можете использовать следующий код. Я использую здесь 01 января 2016 года и 31 декабря 2016 года

var day_start = new Date("Jan 01 2016");
var day_end = new Date("Dec 31 2016");
var total_days = (day_end - day_start) / (1000 * 60 * 60 * 24);
document.getElementById("demo").innerHTML = Math.round(total_days);
<h3>DAYS BETWEEN GIVEN DATES</h3>
<p id="demo"></p>

8
ответ дан mplungjan 17 August 2018 в 09:35
поделиться

Использование Moment.js

var future = moment('05/02/2015');
var start = moment('04/23/2015');
var d = future.diff(start, 'days'); // 9
console.log(d);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>

12
ответ дан Ruslan López 17 August 2018 в 09:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: