2015-07-27 4 views
-1

Я знаю, что этот вопрос был задан несколько раз, прежде чем, но предлагаемые решения всегда были чем-то вродеразница Рассчитайте между датами в JavaScript

var diff = date1 - date2; 

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

Так, например 5y 3m 39d 12h 39i 32s

Но просто разделив разницу слишком неточны для моей цели. Так что я не могу предположить, что каждый месяц имеет 30.4375*24*60*60*1000 миллисекунд.

Мне нужен точный разница! Итак, если date1 - 1 февраля, а date2 - 1 марта, он должен отображать 1 м не 28d (или 29d в високосные годы)!

спасибо.

+0

вы можете взять их в формат даты и вычесть. Он должен работать просто отлично –

+3

Не 1 марта - 31 января, будет 1 месяц 1 день – phuzi

+0

Возможный дубликат [Получите разницу между двумя датами в javascript?] (Http://stackoverflow.com/questions/3224834/get- разница между двумя датами в javascript) – APAD1

ответ

1

Прежде всего, необходимо найти из которых дата больше, вычтите даты, и если они окажутся отрицательными заимствованиями из большей цифры (аналогично элементарной многоразрядной вычитания).

function DateDiff(a,b){ 
    if(b>a){ // We want a-b to be positive 
     var c=b; 
     b=a; 
     a=c; 
    } 
    var s=a.getSeconds()-b.getSeconds(); 
    var mi=a.getMinutes()-b.getMinutes(); 
    var h=a.getHours()-b.getHours(); 
    var d=a.getDate()-b.getDate(); // Subtract days 
    var m=a.getMonth()-b.getMonth(); // Subtract months 
    var y=a.getYear()-b.getYear(); // Subtract years 
    if(s<0){ 
     mi--; 
     s+=60; 
    } 
    if(mi<0){ 
     h--; 
     mi+=60; 
    } 
    if(h<0){ 
     d--; 
     h+=24; 
    } 
    if(d<0){ // Need to borrow from months 
     m--; 
     d+=new Date(1900+b.getYear(),1+b.getMonth(),0).getDate(); 
    }if(m<0){ // Need to borrow from years 
     y--; 
     m+=12; 
    } 
    return [y,m,d,h,mi,s]; 
} 
console.log('Mar 1 - Feb 2 (Leap Year):', DateDiff(new Date(2016,1,2),new Date(2016,2,1))); 
console.log('Mar 1 - Feb 2 (Reg Year): ',DateDiff(new Date(2015,1,2),new Date(2015,2,1))); 
console.log('Feb 1, 2017 - Feb 2, 2016: ',DateDiff(new Date(2017,1,1),new Date(2016,1,2))); 
console.log('5:00 - 4:59: ', DateDiff(new Date(2015,7,1,17), new Date(2015,7,1,16,59))); 
+0

Я тестировал это, но результаты немного неправильны .. PHP имеет собственный метод для вычисления этого и результаты не соответствуют точно. –

+0

Какие даты вы вычитаете, чтобы придумать неправильные результаты? – Pluto

+0

'DateDiff (новая дата (« 2015-07-27 »), новая дата (« 2016-01-06 »));' возвращает '[0,5,10]', но должен возвращать '[0,5,9 ] ' –

0

За то, что вы описываете, вы хотите провести год/месяц/день в трех различных переменных и непосредственно сравнивать с годами с помощью

var yeardiff = date1.GetFullYear() - date2.GetFullYear(); 
    var monthdiff = date1.GetMonth() - date2.GetMonth(); 
    var daydiff = date1.GetDate() - date2.GetDate(); 

Однако, вы будете иметь, чтобы сделать много проверяя это. Например, 8/2/2012 - 7/20/2012 собираются предоставить вам 1 месяц и -18 дней, тогда вам нужно преобразовать их в дни по количеству дней в июле. Из-за этих проблем другое преобразование в OP фактически проще.

1

Вы можете использовать moment.js для достижения этой цели: (MomentJS Doc)

var start = moment(date1); 
var end = moment(date2); 
var diff = end.diff(start) 

Если вы хотите, чтобы определенные вещи, как разница в днях, вы можете сделать:

var diff = end.diff(start, 'days') 
+0

Мне нравится это решение, но если я делаю 'end.diff (start, 'days')', я просто хочу получить дни, которые не подходят в полный месяц/год, но в моем тесте он сказал мне, что там осталось 160 дней .. Есть ли способ сделать это? –

+0

Я немного смущен тем, что вы хотите, однако, отвлекаясь от этого заявления от вас «Так что если дата1 - 1 февраля, а date2 - 1-й марш, он должен отображать 1 м, а не 28d», вы можете использовать ' месячный фильтр, например: https://jsfiddle.net/dsdoj67f/ - Короче говоря, попробуйте: end.diff (начало, «месяцы») – Tillman32

+0

Да, я уже тестировал это, НО хочу разницу в формат «ymdhm s» .. Вы уже объяснили, как получить месяцы, но как я получу дни, которые не заполняют целый месяц? –

-1

Не используя любую библиотеку вы могли бы сделать

function mydiff(aa,bb){var a,b; 
if(aa<bb) a=aa,b=bb; 
else  a=bb,b=aa; 
var am=a.getMonth(),ay=a.getFullYear(); 
var dd=b.getDate()-a.getDate(); 
var dm=b.getMonth()-am-(dd<0?1:0); 
return b.getFullYear()-ay-(dm<0?1:0)+'y, ' 
     + ((12+dm)%12)+'m, ' 
     +((dd<0?new Date(ay, am+1, 0).getDate():0)+dd)+'d'; 
} 

dd содержит разность «Ъ минус в дни месяца», который может быть отрицательным. В этом случае разница месяцев dm должна быть уменьшена на 1, а дневная разница (отрицательная) должна быть увеличена на количество дней предыдущего месяца b. Я получил формулу для «количества дней в конкретном месяце» от here. Подобные действия должны проводиться с месячными и годовыми различиями dm и dm.

Несколько примеров:

mydiff(new Date(2014,1,2),new Date(2014,2,1)) // "0y, 0m, 27d" 
mydiff(new Date(2012,1,1),new Date(2012,2,1)) // "0y, 1m, 0d" (leap year) 
mydiff(new Date(2012,1,2),new Date(2012,2,1)) // "0y, 0m, 28d" (leap year) 
mydiff(new Date(2014,11,31),new Date(2015,0,1)) // "0y, 0m, 1d" (different years) 
mydiff(new Date(2012,10,30),new Date(2013,1,28)) // "0y, 2m, 28d" (different years) 

Последний пример показывает, что такого рода «расчет» имеет свои пределы: по сравнению с «нормальными» месяцев 28 дней не полный месяц. С другой стороны, по сравнению с текущим месяцем 28 февраля составляет полный месяц. Поэтому можно также утверждать, что правильный ответ должен быть "0y, 3m, 0d".

+0

ОК, я вижу, что нисходящее * * было оправдано в некотором смысле: в формуле все еще был недостаток, когда сравнивались две даты разных лет. Эта проблема теперь исправлена, поэтому проверьте ее снова! – cars10m

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