2013-02-17 5 views
2

Я хочу найти разницу между двумя датами. Для этого я вычитал один объект Date из другого объекта Date. Мой код выглядит следующим образом:javascript: рассчитать разницу между двумя датами

var d1 = new Date(); //"now" 
var d2 = new Date(2012,3,17); // before one year 
document.write("</br>Currrent date : "+d1); 
document.write("</br>Other Date : "+d2); 
document.write("</br>Difference : "+new Date(Math.abs(d1-d2))); 

Но результат не так как я ожидал:

Currrent Дата: Вс 17 февраль 2013 2:58:16 GMT-0500 (EST)
Другой Даты: Сб 21 января 2012 00:00:00 GMT-0500 (EST)
разница: Чт 28 Января 1971 21:58:16 GMT-0500 (EST)

Я хочу, чтобы вычислить (1 год) разница между ними.

Благодаря

+1

И результат Вашего расчета должен быть что? Дни? Секунды? Много лет? – migg

+0

Я хочу рассчитать дни, месяцы и годы с этой даты ... – mcacorner

+0

Тогда это становится сложным :) Итак, вы хотите иметь что-то вроде «2 года, 5 месяцев и 23 дней с ...»? – migg

ответ

3

Так фундаментально самая большая точная единица дата является неделю который составляет 7 * 86400 секунд. Месяцы и годы не определены. Поэтому, предполагая, что вы хотите сказать «1 месяц назад», если эти две даты являются, например, 5.1.2013 и 5.2.2013 или 5.2.2013 и 5.3.2013. И сказать «1 месяц и 1 день назад», если у вас есть, например, 5.1.2013 и 6.2.2013, то вам придется использовать расчет, как это:

// dateFrom and dateTo have to be "Date" instances, and to has to be later/bigger than from. 
 
function dateDiff(dateFrom, dateTo) { 
 
    var from = { 
 
    d: dateFrom.getDate(), 
 
    m: dateFrom.getMonth() + 1, 
 
    y: dateFrom.getFullYear() 
 
    }; 
 

 
    var to = { 
 
    d: dateTo.getDate(), 
 
    m: dateTo.getMonth() + 1, 
 
    y: dateTo.getFullYear() 
 
    }; 
 

 
    var daysFebruary = to.y % 4 != 0 || (to.y % 100 == 0 && to.y % 400 != 0)? 28 : 29; 
 
    var daysInMonths = [0, 31, daysFebruary, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 
 

 
    if (to.d < from.d) { 
 
    to.d += daysInMonths[parseInt(to.m)]; 
 
    from.m += 1; 
 
    } 
 
    if (to.m < from.m) { 
 
    to.m += 12; 
 
    from.y += 1; 
 
    } 
 

 
    return { 
 
    days: to.d - from.d, 
 
    months: to.m - from.m, 
 
    years: to.y - from.y 
 
    }; 
 
} 
 
// Difference from 1 June 2016 to now 
 
console.log(dateDiff(new Date(2016,5,1), new Date()));

Как я уже сказал, это становится сложнее;)

+0

Чувак .., Его больше, чем необходимо ... – Exception

+0

@ Исключение, что является более простой альтернативой? Выглядит как можно меньше, учитывая високосный год и переменные дни в месяц. – SimplGy

+0

@SimpleAsCouldBe Взгляните на мой ответ – Exception

2

Вы ищете this?

Math.ceil((new Date(2012, 11, 23) - new Date(2012, 11, 21))/86400000) + 1 
+0

Разница в объектах даты - разница в миллисекундах. Девизор '86400000' предполагает фиксированное количество дней в году, что, судя по всему, не совсем корректно. – SimplGy

+0

@SimpleAsCouldBe 86400000 миллисекунд, эквивалентный одному дню. Итак, логика правильная – Exception

+0

Делает смысл. Таким образом, это вычислит несколько дней. ОП не ясен, но он ищет «2 года, 7 месяцев, 22 дня». Вот что делает проблему сложной. – SimplGy

4

Если вам нужно быть достаточно точным, я предлагаю использовать дни как ваше устройство. Годы имеют переменное количество дней, поэтому делают месяцы, поэтому «1 месяц» или «1 год» может означать разные # дня.

var d1 = new Date(); //"now" 
var d2 = new Date(2012,3,17); // before one year 
var msPerDay = 1000*60*60*24; 
document.write(((d1 - d2)/msPerDay).toFixed(0) + " days ago"); 
0

Вы ищете это?

Math.ceil ((новая дата (2012, 11, 23) - новая дата (2012, 11, 21))/864000) + 1