2009-08-18 5 views
7

Я ищу способ сделать правильное вычитание между двумя объектами даты javascript и получить дельта дня.javascript вычитание даты

Это мой подход, но он не на дату сегодняшнего в качестве входного сигнала:

<script type="text/javascript"> 
function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
var incomingDate = new Date(incomingYear,incomingMonth,incomingDay); 
var today = new Date(); 

var delta = incomingDate - today; 
var resultDate = new Date(delta); 
return resultDate.getDate(); 
} 
//works for the future dates: 
alert(getDayDelta(2009,9,10)); 
alert(getDayDelta(2009,8,19)); 

//fails for the today as input, as expected 0 delta,instead gives 31: 
alert(getDayDelta(2009,8,18)); 
</script> 

Что бы лучше подходят для этого?

ответ

7

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

function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
    var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay), 
     today = new Date(), delta; 
    // EDIT: Set time portion of date to 0:00:00.000 
    // to match time portion of 'incomingDate' 
    today.setHours(0); 
    today.setMinutes(0); 
    today.setSeconds(0); 
    today.setMilliseconds(0); 

    // Remove the time offset of the current date 
    today.setHours(0); 
    today.setMinutes(0); 

    delta = incomingDate - today; 

    return Math.round(delta/1000/60/60/ 24); 
} 


getDayDelta(2008,8,18); // -365 
getDayDelta(2009,8,18); // 0 
getDayDelta(2009,9,18); // 31 
+0

спасибо за исправление, но это, похоже, терпит неудачу: getDayDelta (2009,8,19); // должен возвращать 1, но возвращает 0 (это 18-е место в мое местное время) – Hellnar

+0

Да, это потому, что 'today' включает время, см. мое редактирование ... – CMS

+0

@Crib: проблема в том, что' incomingDate' имеет временную часть 0 часов, 0 минут, 0 секунд и 0 миллисекунд. Вы должны сделать то же самое для 'today', или вы получите частичные дни на день вперед/назад. Я отредактировал ответ, чтобы отразить изменения. –

5

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

Пару икота для наблюдения, хотя: 1) переход на летнее время и 2) обеспечение того, что ваше время исходит из того же часового пояса.

6

(2009,8,18) НЕ 18 августа. Это 18 сентября.

+3

Месяцы относятся к индексу на основе нуля. 0 - январь. – Sampson

+0

Это правильно, поскольку функция даты имеет нулевые индексы месяцев. – MacAnthony

+1

oh javascript, вы так смешно! – Rebs

0

Это будет работать лучше, но это Безразлично правильно обрабатывать отрицательные значения результата. Возможно, вам захочется просто проанализировать ценности самостоятельно и справиться с ними.

function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay); 
var today = new Date(); 
today = new Date(Date.parse(today.format("yyyy/MM/dd"))); 

var delta = incomingDate - today; 
if (delta == 0) { return 0; } 
var resultDate = new Date(delta); 
return resultDate.getDate(); 
} 
//works for the future dates: 
alert(getDayDelta(2009,9,10)); 
alert(getDayDelta(2009,8,19)); 
alert(getDayDelta(2009, 8, 18)); 
+0

формат не является функцией http://is.gd/2n46k – CMS

+0

Тогда почему это работает? (Моя среда - ASP.NET.) –

+1

Да, ASP.NET Ajax Framework расширяет клиентский объект Date – CMS

Смежные вопросы