-
Notifications
You must be signed in to change notification settings - Fork 89
/
Copy pathmoment-precise-range.js
129 lines (115 loc) · 3.71 KB
/
moment-precise-range.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
if (typeof moment === "undefined" && typeof require === 'function') {
var moment = require('moment');
}
(function(moment) {
var STRINGS = {
nodiff: '',
year: 'year',
years: 'years',
month: 'month',
months: 'months',
day: 'day',
days: 'days',
hour: 'hour',
hours: 'hours',
minute: 'minute',
minutes: 'minutes',
second: 'second',
seconds: 'seconds',
delimiter: ' '
};
function pluralize(num, word) {
return num + ' ' + STRINGS[word + (num === 1 ? '' : 's')];
}
function buildStringFromValues(yDiff, mDiff, dDiff, hourDiff, minDiff, secDiff){
var result = [];
if (yDiff) {
result.push(pluralize(yDiff, 'year'));
}
if (mDiff) {
result.push(pluralize(mDiff, 'month'));
}
if (dDiff) {
result.push(pluralize(dDiff, 'day'));
}
if (hourDiff) {
result.push(pluralize(hourDiff, 'hour'));
}
if (minDiff) {
result.push(pluralize(minDiff, 'minute'));
}
if (secDiff) {
result.push(pluralize(secDiff, 'second'));
}
return result.join(STRINGS.delimiter);
}
function buildValueObject(yDiff, mDiff, dDiff, hourDiff, minDiff, secDiff, firstDateWasLater) {
return {
"years" : yDiff,
"months" : mDiff,
"days" : dDiff,
"hours" : hourDiff,
"minutes" : minDiff,
"seconds" : secDiff,
"firstDateWasLater" : firstDateWasLater
}
}
moment.fn.preciseDiff = function(d2, returnValueObject) {
return moment.preciseDiff(this, d2, returnValueObject);
};
moment.preciseDiff = function(d1, d2, returnValueObject) {
var m1 = moment(d1), m2 = moment(d2), firstDateWasLater;
m1.add(m2.utcOffset() - m1.utcOffset(), 'minutes'); // shift timezone of m1 to m2
if (m1.isSame(m2)) {
if (returnValueObject) {
return buildValueObject(0, 0, 0, 0, 0, 0, false);
} else {
return STRINGS.nodiff;
}
}
if (m1.isAfter(m2)) {
var tmp = m1;
m1 = m2;
m2 = tmp;
firstDateWasLater = true;
} else {
firstDateWasLater = false;
}
var yDiff = m2.year() - m1.year();
var mDiff = m2.month() - m1.month();
var dDiff = m2.date() - m1.date();
var hourDiff = m2.hour() - m1.hour();
var minDiff = m2.minute() - m1.minute();
var secDiff = m2.second() - m1.second();
if (secDiff < 0) {
secDiff = 60 + secDiff;
minDiff--;
}
if (minDiff < 0) {
minDiff = 60 + minDiff;
hourDiff--;
}
if (hourDiff < 0) {
hourDiff = 24 + hourDiff;
dDiff--;
}
if (dDiff < 0) {
var daysInLastFullMonth = moment(m2.year() + '-' + (m2.month() + 1), "YYYY-MM").subtract(1, 'M').daysInMonth();
if (daysInLastFullMonth < m1.date()) { // 31/01 -> 2/03
dDiff = daysInLastFullMonth + dDiff + (m1.date() - daysInLastFullMonth);
} else {
dDiff = daysInLastFullMonth + dDiff;
}
mDiff--;
}
if (mDiff < 0) {
mDiff = 12 + mDiff;
yDiff--;
}
if (returnValueObject) {
return buildValueObject(yDiff, mDiff, dDiff, hourDiff, minDiff, secDiff, firstDateWasLater);
} else {
return buildStringFromValues(yDiff, mDiff, dDiff, hourDiff, minDiff, secDiff);
}
};
}(moment));