UNPKG

5.43 kBJavaScriptView Raw
1'use strict';
2
3var FORMATS = {
4 y: getYear,
5 Y: getFullYear,
6 m: getMonth,
7 n: getMonthName,
8 f: getMonthFullName,
9 d: getDay,
10 H: getMilitaryHours,
11 I: getHours,
12 M: getMinutes,
13 S: getSeconds,
14 N: getMillisec,
15 w: getWeekday,
16 W: getFullWeekday,
17 p: getPeriod
18};
19
20var PERIOD = {
21 AM: 'AM',
22 PM: 'PM'
23};
24
25var WEEKS = {
26 ABB: [
27 'Sun',
28 'Mon',
29 'Tue',
30 'Wed',
31 'Thu',
32 'Fri',
33 'Sat'
34 ],
35 FULL: [
36 'Sunday',
37 'Monday',
38 'Tuesday',
39 'Wednesday',
40 'Thursday',
41 'Friday',
42 'Saturday'
43 ]
44};
45
46var MONTHS = {
47 ABB: [
48 'Jan',
49 'Feb',
50 'Mar',
51 'Apr',
52 'May',
53 'Jun',
54 'Jul',
55 'Aug',
56 'Sep',
57 'Oct',
58 'Nov',
59 'Dec'
60 ],
61 FULL: [
62 'January',
63 'February',
64 'March',
65 'April',
66 'May',
67 'June',
68 'July',
69 'August',
70 'September',
71 'October',
72 'November',
73 'December'
74 ]
75};
76
77var ONEDAY = 86400000;
78var ONEHOUR = 3600000;
79
80function DateTime(now, defaultFormat) {
81 this._created = Date.now();
82 this._now = (now) ? new Date(now) : new Date();
83 this._delta = this._created - this._now.getTime();
84 this._defaultFormat = defaultFormat || null;
85}
86
87DateTime.setWeekNames = function (names) {
88 for (var i = 0, len = names.length; i < len; i++) {
89 if (!names[i]) {
90 continue;
91 }
92 WEEKS.FULL[i] = names[i];
93 }
94};
95
96DateTime.setShortWeekNames = function (names) {
97 for (var i = 0, len = names.length; i < len; i++) {
98 if (!names[i]) {
99 continue;
100 }
101 WEEKS.ABB[i] = names[i];
102 }
103};
104
105/**
106periods [ 'AM', 'PM' ]
107*/
108DateTime.setPeriod = function (period) {
109 if (period[0]) {
110 PERIOD.AM = period[0];
111 }
112 if (period[1]) {
113 PERIOD.PM = period[1];
114 }
115};
116
117DateTime.setMonthNames = function (names) {
118 for (var i = 0, len = names.length; i < len; i++) {
119 if (!names[i]) {
120 continue;
121 }
122 MONTHS.FULL[i] = names[i];
123 }
124};
125
126DateTime.setShortMonthNames = function (names) {
127 for (var i = 0, len = names.length; i < len; i++) {
128 if (!names[i]) {
129 continue;
130 }
131 MONTHS.ABB[i] = names[i];
132 }
133};
134
135DateTime.prototype.format = function (format) {
136
137 if (!format && this._defaultFormat) {
138 format = this._defaultFormat;
139 }
140
141 var str = '';
142 for (var i = 0, len = format.length; i < len; i++) {
143 str += this._convert(format[i]);
144 }
145 return str;
146};
147
148DateTime.prototype.now = function () {
149 return Date.now() - this._delta;
150};
151
152DateTime.prototype.epoch = function () {
153 return Math.floor(this.getTime() / 1000);
154};
155
156DateTime.prototype.getTime = function () {
157 return this._now.getTime();
158};
159
160DateTime.prototype.offsetInDays = function (offset) {
161 var next = new Date(this._now);
162 next.setDate(next.getDate() + offset);
163 this._now = next;
164 this._updateDelta();
165};
166
167DateTime.prototype.offsetInHours = function (offset) {
168 var next = new Date(this._now);
169 next.setHours(next.getHours() + offset);
170 this._now = next;
171 this._updateDelta();
172};
173
174DateTime.prototype.getDatesInRange = function (dateObj) {
175
176 if (dateObj instanceof DateTime) {
177 dateObj = dateObj._now;
178 }
179
180 if (this.getTime() >= dateObj.getTime()) {
181 throw new Error('start time cannot be greater than the end time');
182 }
183
184 var list = [];
185 var dir = (dateObj.getTime() >= this.getTime()) ? 1 : -1;
186 var diff = dateObj.getTime() - this.getTime() * dir;
187 var current = new DateTime(this._now);
188
189 while (diff > 0) {
190 list.push(current);
191 var next = new DateTime(current.getTime());
192 next.offsetInDays(1 * dir);
193 current = next;
194 diff -= ONEDAY;
195 }
196
197 return list;
198};
199
200DateTime.prototype.getHoursInRange = function (dateObj) {
201
202 if (dateObj instanceof DateTime) {
203 dateObj = dateObj._now;
204 }
205
206 if (this._now.getTime() >= dateObj.getTime()) {
207 throw new Error('start time cannot be greater than the end time');
208 }
209
210 var list = [];
211 var dir = (dateObj.getTime() >= this._now.getTime()) ? 1 : -1;
212 var diff = dateObj.getTime() - this._now.getTime() * dir;
213 var current = new DateTime(this._now);
214
215 while (diff > 0) {
216 list.push(current);
217 var next = new DateTime(current.getTime());
218 next.offsetInHours(1 * dir);
219 current = next;
220 diff -= ONEHOUR;
221 }
222
223 return list;
224};
225
226DateTime.prototype._convert = function (formatFragment) {
227 var converter = FORMATS[formatFragment];
228
229 if (converter) {
230 return converter(this._now);
231 }
232
233 // no converter
234 return formatFragment;
235};
236
237DateTime.prototype._updateDelta = function () {
238 this._delta = this._created - this._now.getTime();
239};
240
241function getYear(d) {
242 var year = d.getFullYear().toString();
243 return year.substring(year.length - 2);
244}
245
246function getFullYear(d) {
247 return d.getFullYear();
248}
249
250function getMonth(d) {
251 return pad(d.getMonth() + 1);
252}
253
254function getMonthName(d) {
255 return MONTHS.ABB[d.getMonth()];
256}
257
258function getMonthFullName(d) {
259 return MONTHS.FULL[d.getMonth()];
260}
261
262function getDay(d) {
263 return pad(d.getDate());
264}
265
266function getMilitaryHours(d) {
267 return pad(d.getHours());
268}
269
270function getHours(d) {
271 var h = d.getHours();
272 var hours = (h >= 12) ? h - 12 : h;
273 return pad(hours);
274}
275
276function getMinutes(d) {
277 return pad(d.getMinutes());
278}
279
280function getSeconds(d) {
281 return pad(d.getSeconds());
282}
283
284function getMillisec(d) {
285 return mpad(d.getMilliseconds());
286}
287
288function getWeekday(d) {
289 return WEEKS.ABB[d.getDay()];
290}
291
292function getFullWeekday(d) {
293 return WEEKS.FULL[d.getDay()];
294}
295
296function getPeriod(d) {
297 var hours = d.getHours();
298 if (hours < 12) {
299 return PERIOD.AM;
300 }
301 return PERIOD.PM;
302}
303
304function pad(n) {
305 return (n < 10) ? '0' + n : n;
306}
307
308function mpad(n) {
309 var padded = pad(n);
310 return (typeof padded === 'string' || padded < 100) ? '0' + padded : padded;
311}
312
313module.exports = DateTime;