1 | var _ = require('underscore');
|
2 |
|
3 | var _months = {
|
4 | full: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
|
5 | abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
6 | },
|
7 | _days = {
|
8 | full: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
|
9 | abbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
|
10 | alt: {'-1': 'Yesterday', 0: 'Today', 1: 'Tomorrow'}
|
11 | };
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 | exports.defaultTZOffset = 0;
|
21 | exports.DateZ = function () {
|
22 | var members = {
|
23 | 'default': ['getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds', 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds', 'toISOString', 'toGMTString', 'toUTCString', 'valueOf', 'getTime'],
|
24 | z: ['getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds', 'getMinutes', 'getMonth', 'getSeconds', 'getYear', 'toDateString', 'toLocaleDateString', 'toLocaleTimeString'],
|
25 | 'string': ['toLocaleString', 'toString', 'toTimeString'],
|
26 | zSet: ['setDate', 'setFullYear', 'setHours', 'setMilliseconds', 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setYear'],
|
27 | set: ['setUTCDate', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds'],
|
28 | 'static': ['UTC', 'parse']
|
29 | },
|
30 | d = this,
|
31 | i;
|
32 |
|
33 | d.date = d.dateZ = (arguments.length > 1) ? new Date(Date.UTC.apply(Date, arguments) + ((new Date()).getTimezoneOffset() * 60000)) : (arguments.length === 1) ? new Date(new Date(arguments['0'])) : new Date();
|
34 |
|
35 | d.timezoneOffset = d.dateZ.getTimezoneOffset();
|
36 |
|
37 | function zeroPad(i) {
|
38 | return (i < 10) ? '0' + i : i;
|
39 | }
|
40 | function _toTZString() {
|
41 | var hours = zeroPad(Math.floor(Math.abs(d.timezoneOffset) / 60)),
|
42 | minutes = zeroPad(Math.abs(d.timezoneOffset) - hours * 60),
|
43 | prefix = (d.timezoneOffset < 0) ? '+' : '-',
|
44 | abbr = (d.tzAbbreviation === undefined) ? '' : ' (' + d.tzAbbreviation + ')';
|
45 |
|
46 | return 'GMT' + prefix + hours + minutes + abbr;
|
47 | }
|
48 |
|
49 | _.each(members.z, function (name) {
|
50 | d[name] = function () {
|
51 | return d.dateZ[name]();
|
52 | };
|
53 | });
|
54 | _.each(members.string, function (name) {
|
55 | d[name] = function () {
|
56 | return d.dateZ[name].apply(d.dateZ, []).replace(/GMT[+\-]\\d{4} \\(([a-zA-Z]{3,4})\\)/, _toTZString());
|
57 | };
|
58 | });
|
59 | _.each(members['default'], function (name) {
|
60 | d[name] = function () {
|
61 | return d.date[name]();
|
62 | };
|
63 | });
|
64 | _.each(members['static'], function (name) {
|
65 | d[name] = function () {
|
66 | return Date[name].apply(Date, arguments);
|
67 | };
|
68 | });
|
69 | _.each(members.zSet, function (name) {
|
70 | d[name] = function () {
|
71 | d.dateZ[name].apply(d.dateZ, arguments);
|
72 | d.date = new Date(d.dateZ.getTime() - d.dateZ.getTimezoneOffset() * 60000 + d.timezoneOffset * 60000);
|
73 | return d;
|
74 | };
|
75 | });
|
76 | _.each(members.set, function (name) {
|
77 | d[name] = function () {
|
78 | d.date[name].apply(d.date, arguments);
|
79 | d.dateZ = new Date(d.date.getTime() + d.date.getTimezoneOffset() * 60000 - d.timezoneOffset * 60000);
|
80 | return d;
|
81 | };
|
82 | });
|
83 |
|
84 | if (exports.defaultTZOffset) {
|
85 | this.setTimezoneOffset(exports.defaultTZOffset);
|
86 | }
|
87 | };
|
88 | exports.DateZ.prototype = {
|
89 | getTimezoneOffset: function () {
|
90 | return this.timezoneOffset;
|
91 | },
|
92 | setTimezoneOffset: function (offset, abbr) {
|
93 | this.timezoneOffset = offset;
|
94 | if (abbr) {
|
95 | this.tzAbbreviation = abbr;
|
96 | }
|
97 | this.dateZ = new Date(this.date.getTime() + this.date.getTimezoneOffset() * 60000 - this.timezoneOffset * 60000);
|
98 | return this;
|
99 | }
|
100 | };
|
101 |
|
102 |
|
103 | exports.d = function (input) {
|
104 | return (input.getDate() < 10 ? '0' : '') + input.getDate();
|
105 | };
|
106 | exports.D = function (input) {
|
107 | return _days.abbr[input.getDay()];
|
108 | };
|
109 | exports.j = function (input) {
|
110 | return input.getDate();
|
111 | };
|
112 | exports.l = function (input) {
|
113 | return _days.full[input.getDay()];
|
114 | };
|
115 | exports.N = function (input) {
|
116 | var d = input.getDay();
|
117 | return (d >= 1) ? d + 1 : 7;
|
118 | };
|
119 | exports.S = function (input) {
|
120 | var d = input.getDate();
|
121 | return (d % 10 === 1 && d !== 11 ? 'st' : (d % 10 === 2 && d !== 12 ? 'nd' : (d % 10 === 3 && d !== 13 ? 'rd' : 'th')));
|
122 | };
|
123 | exports.w = function (input) {
|
124 | return input.getDay();
|
125 | };
|
126 | exports.z = function (input, offset, abbr) {
|
127 | var year = input.getFullYear(),
|
128 | e = new exports.DateZ(year, input.getMonth(), input.getDate(), 12, 0, 0),
|
129 | d = new exports.DateZ(year, 0, 1, 12, 0, 0);
|
130 |
|
131 | e.setTimezoneOffset(offset, abbr);
|
132 | d.setTimezoneOffset(offset, abbr);
|
133 | return Math.round((e - d) / 86400000);
|
134 | };
|
135 |
|
136 |
|
137 | exports.W = function (input) {
|
138 | var target = new Date(input.valueOf()),
|
139 | dayNr = (input.getDay() + 6) % 7,
|
140 | fThurs;
|
141 |
|
142 | target.setDate(target.getDate() - dayNr + 3);
|
143 | fThurs = target.valueOf();
|
144 | target.setMonth(0, 1);
|
145 | if (target.getDay() !== 4) {
|
146 | target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
|
147 | }
|
148 |
|
149 | return 1 + Math.ceil((fThurs - target) / 604800000);
|
150 | };
|
151 |
|
152 |
|
153 | exports.F = function (input) {
|
154 | return _months.full[input.getMonth()];
|
155 | };
|
156 | exports.m = function (input) {
|
157 | return (input.getMonth() < 9 ? '0' : '') + (input.getMonth() + 1);
|
158 | };
|
159 | exports.M = function (input) {
|
160 | return _months.abbr[input.getMonth()];
|
161 | };
|
162 | exports.n = function (input) {
|
163 | return input.getMonth() + 1;
|
164 | };
|
165 | exports.t = function (input) {
|
166 | return 32 - (new Date(input.getFullYear(), input.getMonth(), 32).getDate());
|
167 | };
|
168 |
|
169 |
|
170 | exports.L = function (input) {
|
171 | return new Date(input.getFullYear(), 1, 29).getDate() === 29;
|
172 | };
|
173 | exports.o = function (input) {
|
174 | var target = new Date(input.valueOf());
|
175 | target.setDate(target.getDate() - ((input.getDay() + 6) % 7) + 3);
|
176 | return target.getFullYear();
|
177 | };
|
178 | exports.Y = function (input) {
|
179 | return input.getFullYear();
|
180 | };
|
181 | exports.y = function (input) {
|
182 | return (input.getFullYear().toString()).substr(2);
|
183 | };
|
184 |
|
185 |
|
186 | exports.a = function (input) {
|
187 | return input.getHours() < 12 ? 'am' : 'pm';
|
188 | };
|
189 | exports.A = function (input) {
|
190 | return input.getHours() < 12 ? 'AM' : 'PM';
|
191 | };
|
192 | exports.B = function (input) {
|
193 | var hours = input.getUTCHours(), beats;
|
194 | hours = (hours === 23) ? 0 : hours + 1;
|
195 | beats = Math.abs(((((hours * 60) + input.getUTCMinutes()) * 60) + input.getUTCSeconds()) / 86.4).toFixed(0);
|
196 | return ('000'.concat(beats).slice(beats.length));
|
197 | };
|
198 | exports.g = function (input) {
|
199 | var h = input.getHours();
|
200 | return h === 0 ? 12 : (h > 12 ? h - 12 : h);
|
201 | };
|
202 | exports.G = function (input) {
|
203 | return input.getHours();
|
204 | };
|
205 | exports.h = function (input) {
|
206 | var h = input.getHours();
|
207 | return ((h < 10 || (12 < h && 22 > h)) ? '0' : '') + ((h < 12) ? h : h - 12);
|
208 | };
|
209 | exports.H = function (input) {
|
210 | var h = input.getHours();
|
211 | return (h < 10 ? '0' : '') + h;
|
212 | };
|
213 | exports.i = function (input) {
|
214 | var m = input.getMinutes();
|
215 | return (m < 10 ? '0' : '') + m;
|
216 | };
|
217 | exports.s = function (input) {
|
218 | var s = input.getSeconds();
|
219 | return (s < 10 ? '0' : '') + s;
|
220 | };
|
221 |
|
222 |
|
223 |
|
224 |
|
225 |
|
226 | exports.O = function (input) {
|
227 | var tz = input.getTimezoneOffset();
|
228 | return (tz < 0 ? '-' : '+') + (tz / 60 < 10 ? '0' : '') + (tz / 60) + '00';
|
229 | };
|
230 |
|
231 | exports.Z = function (input) {
|
232 | return input.getTimezoneOffset() * 60;
|
233 | };
|
234 |
|
235 |
|
236 | exports.c = function (input) {
|
237 | return input.toISOString();
|
238 | };
|
239 | exports.r = function (input) {
|
240 | return input.toUTCString();
|
241 | };
|
242 | exports.U = function (input) {
|
243 | return input.getTime() / 1000;
|
244 | };
|