Я делаю некоторые улучшения библиотеки дат, которые уже возвращают различия в единицах даты, как указано в название этого вопроса. Я хочу, чтобы он возвращал относительные единицы. Я написал код, но мне кажется, что я работаю с неправильным концом математики.Относительная дата: 1/1/1981 01:01:01 - 1/1/1980 = 1y 366d ect, want 1y 1d и т. Д.
Примечание: Забудьте о високосных годах и других тонкостях DateTime. Это для не требовательного приложения.
Вот код, находящийся на рассмотрении.
// get ms between UTC dates and make into "difference" date
var iDiffMS = dt2.valueOf() - dt1.valueOf();
var dtDiff = new Date(iDiffMS);
// calc various diffs
var nYears = dt2.getUTCFullYear() - dt1.getUTCFullYear();
var nMonths = dt2.getUTCMonth() - dt1.getUTCMonth() + (nYears!=0 ? nYears*12 : 0);
var nQuarters = parseInt(nMonths/3); //<<-- different than VBScript, which watches rollover not completion
// these are in absolute terms, ie totals of unit differences, 1/2/1981 - 1/1/1980 = 1y 366d
var nMilliseconds = iDiffMS;
var nSeconds = parseInt(iDiffMS/1000);
var nMinutes = parseInt(nSeconds/60);
var nHours = parseInt(nMinutes/60);
var nDays = parseInt(nHours/24); // <-- now fixed for DST switch days
var nWeeks = parseInt(nDays/7);
// save absolutes
var nYears0=nYears;
var nMonths0=nMonths;
var nQuarters0=nQuarters;
var nWeeks0=nWeeks;
var nDays0=nDays;
var nHours0=nHours;
var nMinutes0=nMinutes;
var nSeconds0=nSeconds;
// HERE! go from absolute to relative, 1/2/1981 - 1/1/1980 = 1y 1d etc, not 1y 366d etc
nQuarters -=nYears0*4;
nMonths -=nYears0*12;
nWeeks -=parseInt((nYears0*52)+(nMonths0*(365.25/52)));
nCalWeeks -=parseInt((nYears0*52)+(nMonths0*(365.25/52)));
nQuarters -=nYears0*4;
nDays -=parseInt((nYears0*365.25) +(nMonths*(365.25/12)));
nHours -=parseInt((nYears0*365.25*24) +(nMonths*(365.25/12*24)) +(nDays*24));
nMinutes -=parseInt((nYears0*365.25*24*60) +(nMonths*(365.25/12*24*60)) +(nDays*24*60) +(nHours*60));
nSeconds -=parseInt((nYears0*365.25*24*60*60) +(nMonths*(365.25/12*24*60*60)) +(nDays*24*60*60) +(nHours*60*60) +(nMinutes*60));
nMilliseconds -=parseInt((nYears0*365.25*24*60*60*1000) +(nMonths*(365.25/12*24*60*60*1000))+(nDays*24*60*60*1000) +(nHours*60*60*1000) +(nMinutes*60*1000) + (nSeconds*1000));
// END
В вашем желаемом формате, какой правильный ответ за 3/3/1981 - 1/1/1980? Вы хотите «1 год, 2 месяца, 2 дня»? –
Да, просто используйте разницу в миллисекундах (после 1970 года) и преобразуйте его обратно – maraca
Да, 1 год, 2 месяца, 2 дня, x часов и т. Д. –