1 |
|
2 |
|
3 |
|
4 |
|
5 | var s = 1000;
|
6 | var m = s * 60;
|
7 | var h = m * 60;
|
8 | var d = h * 24;
|
9 | var y = d * 365.25;
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 | module.exports = function(val, options) {
|
26 | options = options || {};
|
27 | var type = typeof val;
|
28 | if (type === 'string' && val.length > 0) {
|
29 | return parse(val);
|
30 | } else if (type === 'number' && isNaN(val) === false) {
|
31 | return options.long ? fmtLong(val) : fmtShort(val);
|
32 | }
|
33 | throw new Error(
|
34 | 'val is not a non-empty string or a valid number. val=' +
|
35 | JSON.stringify(val)
|
36 | );
|
37 | };
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 | function parse(str) {
|
48 | str = String(str);
|
49 | if (str.length > 100) {
|
50 | return;
|
51 | }
|
52 | var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
|
53 | str
|
54 | );
|
55 | if (!match) {
|
56 | return;
|
57 | }
|
58 | var n = parseFloat(match[1]);
|
59 | var type = (match[2] || 'ms').toLowerCase();
|
60 | switch (type) {
|
61 | case 'years':
|
62 | case 'year':
|
63 | case 'yrs':
|
64 | case 'yr':
|
65 | case 'y':
|
66 | return n * y;
|
67 | case 'days':
|
68 | case 'day':
|
69 | case 'd':
|
70 | return n * d;
|
71 | case 'hours':
|
72 | case 'hour':
|
73 | case 'hrs':
|
74 | case 'hr':
|
75 | case 'h':
|
76 | return n * h;
|
77 | case 'minutes':
|
78 | case 'minute':
|
79 | case 'mins':
|
80 | case 'min':
|
81 | case 'm':
|
82 | return n * m;
|
83 | case 'seconds':
|
84 | case 'second':
|
85 | case 'secs':
|
86 | case 'sec':
|
87 | case 's':
|
88 | return n * s;
|
89 | case 'milliseconds':
|
90 | case 'millisecond':
|
91 | case 'msecs':
|
92 | case 'msec':
|
93 | case 'ms':
|
94 | return n;
|
95 | default:
|
96 | return undefined;
|
97 | }
|
98 | }
|
99 |
|
100 |
|
101 |
|
102 |
|
103 |
|
104 |
|
105 |
|
106 |
|
107 |
|
108 | function fmtShort(ms) {
|
109 | if (ms >= d) {
|
110 | return Math.round(ms / d) + 'd';
|
111 | }
|
112 | if (ms >= h) {
|
113 | return Math.round(ms / h) + 'h';
|
114 | }
|
115 | if (ms >= m) {
|
116 | return Math.round(ms / m) + 'm';
|
117 | }
|
118 | if (ms >= s) {
|
119 | return Math.round(ms / s) + 's';
|
120 | }
|
121 | return ms + 'ms';
|
122 | }
|
123 |
|
124 |
|
125 |
|
126 |
|
127 |
|
128 |
|
129 |
|
130 |
|
131 |
|
132 | function fmtLong(ms) {
|
133 | return plural(ms, d, 'day') ||
|
134 | plural(ms, h, 'hour') ||
|
135 | plural(ms, m, 'minute') ||
|
136 | plural(ms, s, 'second') ||
|
137 | ms + ' ms';
|
138 | }
|
139 |
|
140 |
|
141 |
|
142 |
|
143 |
|
144 | function plural(ms, n, name) {
|
145 | if (ms < n) {
|
146 | return;
|
147 | }
|
148 | if (ms < n * 1.5) {
|
149 | return Math.floor(ms / n) + ' ' + name;
|
150 | }
|
151 | return Math.ceil(ms / n) + ' ' + name + 's';
|
152 | }
|