Разница в дате в Javascript (без учета времени суток) - PullRequest
53 голосов
/ 24 июня 2009

Я пишу заявку на аренду оборудования, в которой с клиентов взимается плата за аренду оборудования в зависимости от срока аренды (в днях). Таким образом, в основном, (ежедневная плата * количество дней) = общая стоимость.

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

function dateDiff1(startDate, endDate) {
    return ((endDate.getTime() - startDate.getTime()) / 1000*60*60*24);
}

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

Например, если кто-то проверил оборудование в 6 часов утра 6 июля и вернул его в 10 часов вечера 7 июля, приведенный выше код вычислит, что прошло более одного 24-часового периода, и вернет 2. Желаемый результат равен 1 , поскольку истекла только одна календарная дата (т.е. с 6-го по 7-е).

Наиболее близким решением, которое я нашел, является эта функция:

function dateDiff2(startDate, endDate) {
    return endDate.getDate() - startDate.getDate();
}

, который делает именно то, что я хочу, если эти две даты находятся в одном месяце. Однако, поскольку getDate () возвращает только день месяца (т. Е. 1-31), он не работает, если даты охватывают несколько месяцев (например, с 31 июля по 1 августа - 1 день, а в приведенном выше примере 1 - 31 или -29).

В бэкэнде в PHP я использую gregoriantojd (), который, кажется, работает нормально (см. этот пост для примера). Я просто не могу найти эквивалентное решение в Javascript.

У кого-нибудь есть идеи?

Ответы [ 15 ]

1 голос
/ 24 июня 2009

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

function dateDiff(startDate, endDate) {
    // set startDate to the beginning of the day
    startDate = new Date(
        startDate.getFullYear(),
        startDate.getMonth(),
        startDate.getDate());

    return Math.floor((endDate - startDate) / 1000*60*60*24);
}
0 голосов
/ 22 августа 2014

Я знаю, что это частичное решение, но вы можете получить дни между датами (если даты не установлены). Тогда вы можете работать оттуда.

Я основываю это решение на проблеме, с которой вы столкнулись ((ежедневная плата * количество дней) = общая стоимость); не фактическая разница в дате. Это должно помочь вам.

var Main = function() {
    var startDate = new Date('08/20/2014');
    var endDate = new Date('08/22/2014');
    var totalCharge = monthlyFee * daysBetween(startDate, endDate);
}

var daysBetween = function(startDate, endDate) {
    return Math.round(Math.abs((startDate.getTime() - endDate.getTime())/(24*60*60*1000)));
};
0 голосов
/ 30 апреля 2013

Нужно date.js, http://code.google.com/p/datejs/

функция CalculateDuration (startDate, endDate) {

var sdt = Date.parse(startDate);
var edt = Date.parse(endDate);

var sdtYear = sdt.getYear();
var edtYear = edt.getYear();
var sdtMonth = sdt.getMonth();
var edtMonth = edt.getMonth();
var sdtDay = sdt.getDate();
var edtDay = edt.getDate();

var StartDateMonthDays = Date.getDaysInMonth(sdtYear, sdtMonth);
var EndDateMonthDays = Date.getDaysInMonth(edtYear, edtMonth);

if (edtMonth < sdtMonth) { //Means the ending month is earlier, which invalidates the operation

    alert("Ending month cannot be earlier than the starting month")

}

//Months are equal, if month is the next month of the start date month, 
//the operation fails, thus we need to calculate month difference first
else if (edtMonth > sdtMonth) {

    //Need to count how many days are left to finish the month
    var daysToMonthFinish = StartDateMonthDays - sdtDay;
    var calculatedDuration = daysToMonthFinish + edtDay;
    $("#hdn_duration").val(calculatedDuration);

}
//If months are the same, it is safe to just calculate the end day minus the start day
else {

    var calcDuration = edtDay - sdtDay;
    $("#hdn_duration").val(calcDuration);
}
0 голосов
/ 28 апреля 2013

Просто из любопытства:

Если вы можете подтвердить, что результат будет ВСЕГДА составлять <31 день, то решение также будет следующим: </p>

var deltaDays = new Date(endDate - startDate).getDate()-1

Почему?

Хорошо разлагает предыдущую строку:

var msecs = endDate - startDate; // difference in milliseconds
var dt = new Date(msecs); // will give us a date object pointing to a time 
                          // somewhere in Jan 1970 (given the precondition above)
var days = dt.getDate();  // Take the day part of it
var deltaDays = days - 1; // since the numbering starts from 1, we have to 
                          // substract 1 (Ex. if the diff in msecs is 0. The
                          // Date will point to 1st of Jan 1970)

Но, очевидно, вы должны НЕ использовать его, если ваши результаты могут быть> 31.

0 голосов
/ 22 февраля 2013

+ вверх пример выше, который использует конструкторы UTC. Без этого вас закроют летние / летние часы.

Если вы возьмете различия в некоторых из них, это может привести к сокращению на час, если пересечь линию DST для вашего часового пояса в одном направлении (весной вперед, то есть, например, в феврале, спрашивая апрель). Когда вы наберете N + 23/24, вы получите N.

Другое направление (в октябре с запросом на декабрь) должно быть в порядке, вы в конечном итоге окажетесь на час впереди, с которым справится floor () правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...