forked from mudassir0909/jsonresume-theme-elegant
-
Notifications
You must be signed in to change notification settings - Fork 0
/
moment-precise-range.js
108 lines (97 loc) · 3.39 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
// Originally taken from https://github.com/codebox/moment-precise-range
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: ' '
};
moment.fn.preciseDiff = function(d2) {
return moment.preciseDiff(this, d2);
};
moment.preciseDiff = function(d1, d2) {
var m1 = moment(d1), m2 = moment(d2);
/*
The difference between two dates say 01-02-2016 & 31-03-2016 comes out as 1 month 30days
because technically it's the difference between 01-02-2016:00:00:00 & 31-03-2016:00:00:00
But when someone enters start date & end date in resume, they mean start of the start date
and end of the end date.
The next two lines makes that correction, the start date is set as the start of the day, while
end date is set as start of the day of the very next day. Basically in the above example, instead
of making 31-03-2016:00:00:00 to 31-03-2016:23:59:59 which will get duration as 1 month 29days 23hours 59minutes 59sections
It is changed to 01-04-2016:00:00:00 instead, to get the precise calculation
*/
m1 = m1.startOf('day');
m2 = m2.add(1, 'day').startOf('day');
if (m1.isSame(m2)) {
return STRINGS.nodiff;
}
if (m1.isAfter(m2)) {
var tmp = m1;
m1 = m2;
m2 = tmp;
}
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--;
}
function pluralize(num, word) {
return num + ' ' + STRINGS[word + (num === 1 ? '' : 's')];
}
if (!yDiff && !mDiff) {
if (dDiff >= 1) {
return pluralize(dDiff, 'day');
} else {
return 'Joined Today';
}
} else {
var result = [];
if (yDiff) {
result.push(pluralize(yDiff, 'year'));
}
if (mDiff) {
result.push(pluralize(mDiff, 'month'));
}
return result.join(STRINGS.delimiter);
}
};
}(moment));
module.exports = moment;