1 define(['./totalDaysInMonth', './totalDaysInYear', '../time/convert'], function(totalDaysInMonth, totalDaysInYear, convert){
4 * calculate the difference between dates (range)
6 function diff(start, end, unitName){
7 // sort the dates to make it easier to process (specially year/month)
16 if (unitName === 'month') {
17 output = getMonthsDiff(start, end);
18 } else if (unitName === 'year'){
19 output = getYearsDiff(start, end);
20 } else if (unitName != null) {
21 if (unitName === 'day') {
22 // ignore timezone difference because of daylight savings time
26 output = convert(end - start, 'ms', unitName);
36 // we ignore timezone differences on purpose because of daylight
37 // savings time, otherwise it would return fractional days/weeks even
38 // if a full day elapsed. eg:
39 // Wed Feb 12 2014 00:00:00 GMT-0200 (BRST)
40 // Sun Feb 16 2014 00:00:00 GMT-0300 (BRT)
41 // diff should be 4 days and not 4.041666666666667
42 return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(),
43 d.getHours(), d.getMinutes(), d.getSeconds(),
48 function getMonthsDiff(start, end){
49 return getElapsedMonths(start, end) +
50 getElapsedYears(start, end) * 12 +
51 getFractionalMonth(start, end);
55 function getYearsDiff(start, end){
56 var elapsedYears = getElapsedYears(start, end);
57 return elapsedYears + getFractionalYear(start, end, elapsedYears);
61 function getElapsedMonths(start, end){
62 var monthDiff = end.getMonth() - start.getMonth();
66 // less than a full month
67 if (start.getDate() > end.getDate()) {
74 function getElapsedYears(start, end){
75 var yearDiff = end.getFullYear() - start.getFullYear();
76 // less than a full year
77 if (start.getMonth() > end.getMonth()) {
84 function getFractionalMonth(start, end){
85 var fractionalDiff = 0;
86 var startDay = start.getDate();
87 var endDay = end.getDate();
89 if (startDay !== endDay) {
90 var startTotalDays = totalDaysInMonth(start);
91 var endTotalDays = totalDaysInMonth(end);
95 if (startDay > endDay) {
96 // eg: Jan 29 - Feb 27 (29 days elapsed but not a full month)
97 var baseDay = startTotalDays - startDay;
98 daysElapsed = endDay + baseDay;
99 // total days should be relative to 1st day of next month if
100 // startDay > endTotalDays
101 totalDays = (startDay > endTotalDays)?
102 endTotalDays + baseDay + 1 : startDay + baseDay;
104 // fractional is only based on endMonth eg: Jan 12 - Feb 18
105 // (6 fractional days, 28 days until next full month)
106 daysElapsed = endDay - startDay;
107 totalDays = endTotalDays;
110 fractionalDiff = daysElapsed / totalDays;
113 return fractionalDiff;
117 function getFractionalYear(start, end, elapsedYears){
118 var base = elapsedYears?
119 new Date(end.getFullYear(), start.getMonth(), start.getDate()) :
121 var elapsedDays = diff(base, end, 'day');
122 return elapsedDays / totalDaysInYear(end);