date-and-time 0.14.2 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/EXTEND.md +29 -11
  2. package/LOCALE.md +19 -34
  3. package/PLUGINS.md +222 -113
  4. package/README.md +203 -171
  5. package/date-and-time.js +171 -147
  6. package/date-and-time.min.js +14 -14
  7. package/esm/date-and-time.es.js +466 -0
  8. package/esm/date-and-time.es.min.js +17 -0
  9. package/esm/date-and-time.mjs +466 -0
  10. package/esm/locale/ar.es.js +39 -0
  11. package/esm/locale/ar.mjs +39 -0
  12. package/esm/locale/az.es.js +44 -0
  13. package/esm/locale/az.mjs +44 -0
  14. package/esm/locale/bn.es.js +50 -0
  15. package/esm/locale/bn.mjs +50 -0
  16. package/esm/locale/cs.es.js +22 -0
  17. package/esm/locale/cs.mjs +22 -0
  18. package/esm/locale/de.es.js +23 -0
  19. package/esm/locale/de.mjs +23 -0
  20. package/esm/locale/dk.es.js +22 -0
  21. package/esm/locale/dk.mjs +22 -0
  22. package/esm/locale/el.es.js +44 -0
  23. package/esm/locale/el.mjs +44 -0
  24. package/esm/locale/en.es.js +13 -0
  25. package/esm/locale/en.mjs +13 -0
  26. package/esm/locale/es.es.js +42 -0
  27. package/esm/locale/es.mjs +42 -0
  28. package/esm/locale/fa.es.js +39 -0
  29. package/esm/locale/fa.mjs +39 -0
  30. package/esm/locale/fr.es.js +23 -0
  31. package/esm/locale/fr.mjs +23 -0
  32. package/esm/locale/hi.es.js +50 -0
  33. package/esm/locale/hi.mjs +50 -0
  34. package/esm/locale/hu.es.js +23 -0
  35. package/esm/locale/hu.mjs +23 -0
  36. package/esm/locale/id.es.js +46 -0
  37. package/esm/locale/id.mjs +46 -0
  38. package/esm/locale/it.es.js +23 -0
  39. package/esm/locale/it.mjs +23 -0
  40. package/esm/locale/ja.es.js +31 -0
  41. package/esm/locale/ja.mjs +31 -0
  42. package/esm/locale/jv.es.js +46 -0
  43. package/esm/locale/jv.mjs +46 -0
  44. package/esm/locale/ko.es.js +23 -0
  45. package/esm/locale/ko.mjs +23 -0
  46. package/esm/locale/my.es.js +38 -0
  47. package/esm/locale/my.mjs +38 -0
  48. package/esm/locale/nl.es.js +37 -0
  49. package/esm/locale/nl.mjs +37 -0
  50. package/esm/locale/pa-in.es.js +62 -0
  51. package/esm/locale/pa-in.mjs +62 -0
  52. package/esm/locale/pl.es.js +37 -0
  53. package/esm/locale/pl.mjs +37 -0
  54. package/esm/locale/pt.es.js +44 -0
  55. package/esm/locale/pt.mjs +44 -0
  56. package/esm/locale/ro.es.js +22 -0
  57. package/esm/locale/ro.mjs +22 -0
  58. package/esm/locale/ru.es.js +44 -0
  59. package/esm/locale/ru.mjs +44 -0
  60. package/esm/locale/rw.es.js +22 -0
  61. package/esm/locale/rw.mjs +22 -0
  62. package/esm/locale/sr.es.js +22 -0
  63. package/esm/locale/sr.mjs +22 -0
  64. package/esm/locale/th.es.js +23 -0
  65. package/esm/locale/th.mjs +23 -0
  66. package/esm/locale/tr.es.js +22 -0
  67. package/esm/locale/tr.mjs +22 -0
  68. package/esm/locale/uk.es.js +57 -0
  69. package/esm/locale/uk.mjs +57 -0
  70. package/esm/locale/uz.es.js +22 -0
  71. package/esm/locale/uz.mjs +22 -0
  72. package/esm/locale/vi.es.js +23 -0
  73. package/esm/locale/vi.mjs +23 -0
  74. package/esm/locale/zh-cn.es.js +48 -0
  75. package/esm/locale/zh-cn.mjs +48 -0
  76. package/esm/locale/zh-tw.es.js +46 -0
  77. package/esm/locale/zh-tw.mjs +46 -0
  78. package/esm/plugin/day-of-week.es.js +19 -0
  79. package/esm/plugin/day-of-week.mjs +19 -0
  80. package/esm/plugin/meridiem.es.js +47 -0
  81. package/esm/plugin/meridiem.mjs +47 -0
  82. package/esm/plugin/microsecond.es.js +31 -0
  83. package/esm/plugin/microsecond.mjs +31 -0
  84. package/esm/plugin/ordinal.es.js +34 -0
  85. package/esm/plugin/ordinal.mjs +34 -0
  86. package/esm/plugin/timespan.es.js +75 -0
  87. package/esm/plugin/timespan.mjs +75 -0
  88. package/esm/plugin/timezone.es.js +73 -0
  89. package/esm/plugin/timezone.mjs +73 -0
  90. package/esm/plugin/two-digit-year.es.js +21 -0
  91. package/esm/plugin/two-digit-year.mjs +21 -0
  92. package/locale/ar.js +14 -19
  93. package/locale/az.js +14 -19
  94. package/locale/bn.js +14 -19
  95. package/locale/cs.js +14 -19
  96. package/locale/de.js +15 -20
  97. package/locale/dk.js +15 -20
  98. package/locale/el.js +21 -24
  99. package/locale/en.js +17 -19
  100. package/locale/es.js +14 -19
  101. package/locale/fa.js +14 -19
  102. package/locale/fr.js +14 -19
  103. package/locale/hi.js +14 -19
  104. package/locale/hu.js +14 -19
  105. package/locale/id.js +14 -19
  106. package/locale/it.js +14 -19
  107. package/locale/ja.js +14 -19
  108. package/locale/jv.js +14 -19
  109. package/locale/ko.js +14 -19
  110. package/locale/my.js +14 -19
  111. package/locale/nl.js +20 -23
  112. package/locale/pa-in.js +14 -19
  113. package/locale/pl.js +20 -23
  114. package/locale/pt.js +14 -19
  115. package/locale/ro.js +15 -20
  116. package/locale/ru.js +14 -19
  117. package/locale/rw.js +30 -0
  118. package/locale/sr.js +14 -19
  119. package/locale/th.js +14 -19
  120. package/locale/tr.js +14 -19
  121. package/locale/uk.js +23 -26
  122. package/locale/uz.js +14 -19
  123. package/locale/vi.js +14 -19
  124. package/locale/zh-cn.js +14 -19
  125. package/locale/zh-tw.js +14 -19
  126. package/package.json +26 -11
  127. package/plugin/day-of-week.js +13 -14
  128. package/plugin/meridiem.js +32 -24
  129. package/plugin/microsecond.js +14 -15
  130. package/plugin/ordinal.js +13 -14
  131. package/plugin/timespan.js +13 -14
  132. package/plugin/timezone.js +81 -0
  133. package/plugin/two-digit-year.js +13 -19
package/date-and-time.js CHANGED
@@ -1,11 +1,14 @@
1
- /**
2
- * @preserve date-and-time.js (c) KNOWLEDGECODE | MIT
3
- */
4
- (function (global) {
5
- 'use strict';
6
-
7
- var date = {},
8
- locales = {},
1
+ (function (global, factory) {
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3
+ typeof define === 'function' && define.amd ? define(factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.date = factory());
5
+ })(this, (function () { 'use strict';
6
+
7
+ /**
8
+ * @preserve date-and-time (c) KNOWLEDGECODE | MIT
9
+ */
10
+
11
+ var locales = {},
9
12
  plugins = {},
10
13
  lang = 'en',
11
14
  _res = {
@@ -41,8 +44,12 @@
41
44
  dddd: function (d/*, formatString*/) { return this.res.dddd[d.getDay()]; },
42
45
  ddd: function (d/*, formatString*/) { return this.res.ddd[d.getDay()]; },
43
46
  dd: function (d/*, formatString*/) { return this.res.dd[d.getDay()]; },
44
- Z: function (d/*, formatString*/) { return d.utc ? '+0000' : /[\+-]\d{4}/.exec(d.toTimeString())[0]; },
45
- post: function (str) { return str; }
47
+ Z: function (d/*, formatString*/) {
48
+ var offset = d.getTimezoneOffset() / 0.6 | 0;
49
+ return (offset > 0 ? '-' : '+') + ('000' + Math.abs(offset - (offset % 100 * 0.4 | 0))).slice(-4);
50
+ },
51
+ post: function (str) { return str; },
52
+ res: _res
46
53
  },
47
54
  _parser = {
48
55
  YYYY: function (str/*, formatString */) { return this.exec(/^\d{4}/, str); },
@@ -103,39 +110,37 @@
103
110
  }
104
111
  return { value: index, length: length };
105
112
  },
106
- pre: function (str) { return str; }
113
+ pre: function (str) { return str; },
114
+ res: _res
107
115
  },
108
- customize = function (code, base, locale) {
109
- var extend = function (proto, props, res) {
110
- var Locale = function (r) {
111
- if (r) { this.res = r; }
112
- };
113
-
114
- Locale.prototype = proto;
115
- Locale.prototype.constructor = Locale;
116
-
117
- var newLocale = new Locale(res),
118
- value;
119
-
120
- for (var key in props || {}) {
121
- value = props[key];
122
- newLocale[key] = value.slice ? value.slice() : value;
123
- }
124
- return newLocale;
125
- },
126
- loc = { res: extend(base.res, locale.res) };
116
+ extend = function (base, props, override, res) {
117
+ var obj = {}, key;
127
118
 
128
- loc.formatter = extend(base.formatter, locale.formatter, loc.res);
129
- loc.parser = extend(base.parser, locale.parser, loc.res);
130
- locales[code] = loc;
119
+ for (key in base) {
120
+ obj[key] = base[key];
121
+ }
122
+ for (key in props || {}) {
123
+ if (!(!!override ^ !!obj[key])) {
124
+ obj[key] = props[key];
125
+ }
126
+ }
127
+ if (res) {
128
+ obj.res = res;
129
+ }
130
+ return obj;
131
131
  };
132
132
 
133
+ var proto = {
134
+ _formatter: _formatter,
135
+ _parser: _parser
136
+ };
137
+
133
138
  /**
134
- * compiling a format string
139
+ * Compiling a format string
135
140
  * @param {string} formatString - a format string
136
141
  * @returns {Array.<string>} a compiled object
137
142
  */
138
- date.compile = function (formatString) {
143
+ proto.compile = function (formatString) {
139
144
  var re = /\[([^\[\]]|\[[^\[\]]*])*]|([A-Za-z])\2+|\.{3}|./g, keys, pattern = [formatString];
140
145
 
141
146
  while ((keys = re.exec(formatString))) {
@@ -145,18 +150,19 @@
145
150
  };
146
151
 
147
152
  /**
148
- * formatting a date
153
+ * Formatting a Date and Time
149
154
  * @param {Date} dateObj - a Date object
150
- * @param {string|Array.<string>} arg - a format string or a compiled object
155
+ * @param {string|Array.<string>} arg - a format string or its compiled object
151
156
  * @param {boolean} [utc] - output as UTC
152
157
  * @returns {string} a formatted string
153
158
  */
154
- date.format = function (dateObj, arg, utc) {
155
- var pattern = typeof arg === 'string' ? date.compile(arg) : arg,
156
- d = date.addMinutes(dateObj, utc ? dateObj.getTimezoneOffset() : 0),
157
- formatter = locales[lang].formatter, str = '';
159
+ proto.format = function (dateObj, arg, utc) {
160
+ var pattern = typeof arg === 'string' ? this.compile(arg) : arg,
161
+ offset = dateObj.getTimezoneOffset(),
162
+ d = this.addMinutes(dateObj, utc ? offset : 0),
163
+ formatter = this._formatter, str = '';
158
164
 
159
- d.utc = utc || false;
165
+ d.getTimezoneOffset = function () { return utc ? 0 : offset; };
160
166
  for (var i = 1, len = pattern.length, token; i < len; i++) {
161
167
  token = pattern[i];
162
168
  str += formatter[token] ? formatter.post(formatter[token](d, pattern[0])) : token.replace(/\[(.*)]/, '$1');
@@ -165,15 +171,15 @@
165
171
  };
166
172
 
167
173
  /**
168
- * pre-parsing a date string
174
+ * Pre-parsing a Date and Time string
169
175
  * @param {string} dateString - a date string
170
- * @param {string|Array.<string>} arg - a format string or a compiled object
176
+ * @param {string|Array.<string>} arg - a format string or its compiled object
171
177
  * @returns {Object} a date structure
172
178
  */
173
- date.preparse = function (dateString, arg) {
174
- var pattern = typeof arg === 'string' ? date.compile(arg) : arg,
179
+ proto.preparse = function (dateString, arg) {
180
+ var pattern = typeof arg === 'string' ? this.compile(arg) : arg,
175
181
  dt = { Y: 1970, M: 1, D: 1, H: 0, A: 0, h: 0, m: 0, s: 0, S: 0, Z: 0, _index: 0, _length: 0, _match: 0 },
176
- comment = /\[(.*)]/, parser = locales[lang].parser, offset = 0;
182
+ comment = /\[(.*)]/, parser = this._parser, offset = 0;
177
183
 
178
184
  dateString = parser.pre(dateString);
179
185
  for (var i = 1, len = pattern.length, token, result; i < len; i++) {
@@ -184,7 +190,7 @@
184
190
  break;
185
191
  }
186
192
  offset += result.length;
187
- dt[token.charAt(0)] = result.value;
193
+ dt[result.token || token.charAt(0)] = result.value;
188
194
  dt._match++;
189
195
  } else if (token === dateString.charAt(offset) || token === ' ') {
190
196
  offset++;
@@ -204,34 +210,16 @@
204
210
  };
205
211
 
206
212
  /**
207
- * validation
208
- * @param {Object|string} arg1 - a date structure or a date string
209
- * @param {string|Array.<string>} [arg2] - a format string or a compiled object
210
- * @returns {boolean} whether the date string is a valid date
211
- */
212
- date.isValid = function (arg1, arg2) {
213
- var dt = typeof arg1 === 'string' ? date.preparse(arg1, arg2) : arg1,
214
- last = [31, 28 + date.isLeapYear(dt.Y) | 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][dt.M - 1];
215
-
216
- return !(
217
- dt._index < 1 || dt._length < 1 || dt._index - dt._length || dt._match < 1 ||
218
- dt.Y < 1 || dt.Y > 9999 || dt.M < 1 || dt.M > 12 || dt.D < 1 || dt.D > last ||
219
- dt.H < 0 || dt.H > 23 || dt.m < 0 || dt.m > 59 || dt.s < 0 || dt.s > 59 || dt.S < 0 || dt.S > 999 ||
220
- dt.Z < -720 || dt.Z > 840
221
- );
222
- };
223
-
224
- /**
225
- * parsing a date string
213
+ * Parsing a Date and Time string
226
214
  * @param {string} dateString - a date string
227
- * @param {string|Array.<string>} arg - a format string or a compiled object
215
+ * @param {string|Array.<string>} arg - a format string or its compiled object
228
216
  * @param {boolean} [utc] - input as UTC
229
217
  * @returns {Date} a constructed date
230
218
  */
231
- date.parse = function (dateString, arg, utc) {
232
- var dt = date.preparse(dateString, arg);
219
+ proto.parse = function (dateString, arg, utc) {
220
+ var dt = this.preparse(dateString, arg);
233
221
 
234
- if (date.isValid(dt)) {
222
+ if (this.isValid(dt)) {
235
223
  dt.M -= dt.Y < 100 ? 22801 : 1; // 22801 = 1900 * 12 + 1
236
224
  if (utc || dt.Z) {
237
225
  return new Date(Date.UTC(dt.Y, dt.M, dt.D, dt.H, dt.m + dt.Z, dt.s, dt.S));
@@ -242,34 +230,52 @@
242
230
  };
243
231
 
244
232
  /**
245
- * transformation of date string
233
+ * Validation
234
+ * @param {Object|string} arg1 - a date structure or a date string
235
+ * @param {string|Array.<string>} [arg2] - a format string or its compiled object
236
+ * @returns {boolean} whether the date string is a valid date
237
+ */
238
+ proto.isValid = function (arg1, arg2) {
239
+ var dt = typeof arg1 === 'string' ? this.preparse(arg1, arg2) : arg1,
240
+ last = [31, 28 + this.isLeapYear(dt.Y) | 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][dt.M - 1];
241
+
242
+ return !(
243
+ dt._index < 1 || dt._length < 1 || dt._index - dt._length || dt._match < 1 ||
244
+ dt.Y < 1 || dt.Y > 9999 || dt.M < 1 || dt.M > 12 || dt.D < 1 || dt.D > last ||
245
+ dt.H < 0 || dt.H > 23 || dt.m < 0 || dt.m > 59 || dt.s < 0 || dt.s > 59 || dt.S < 0 || dt.S > 999 ||
246
+ dt.Z < -720 || dt.Z > 840
247
+ );
248
+ };
249
+
250
+ /**
251
+ * Transforming a Date and Time string
246
252
  * @param {string} dateString - a date string
247
- * @param {string|Array.<string>} arg1 - the format string of the date string or the compiled object
248
- * @param {string|Array.<string>} arg2 - the transformed format string or the compiled object
253
+ * @param {string|Array.<string>} arg1 - a format string or its compiled object
254
+ * @param {string|Array.<string>} arg2 - a transformed format string or its compiled object
249
255
  * @param {boolean} [utc] - output as UTC
250
256
  * @returns {string} a formatted string
251
257
  */
252
- date.transform = function (dateString, arg1, arg2, utc) {
253
- return date.format(date.parse(dateString, arg1), arg2, utc);
258
+ proto.transform = function (dateString, arg1, arg2, utc) {
259
+ return this.format(this.parse(dateString, arg1), arg2, utc);
254
260
  };
255
261
 
256
262
  /**
257
- * adding years
263
+ * Adding years
258
264
  * @param {Date} dateObj - a date object
259
265
  * @param {number} years - number of years to add
260
266
  * @returns {Date} a date after adding the value
261
267
  */
262
- date.addYears = function (dateObj, years) {
263
- return date.addMonths(dateObj, years * 12);
268
+ proto.addYears = function (dateObj, years) {
269
+ return this.addMonths(dateObj, years * 12);
264
270
  };
265
271
 
266
272
  /**
267
- * adding months
273
+ * Adding months
268
274
  * @param {Date} dateObj - a date object
269
275
  * @param {number} months - number of months to add
270
276
  * @returns {Date} a date after adding the value
271
277
  */
272
- date.addMonths = function (dateObj, months) {
278
+ proto.addMonths = function (dateObj, months) {
273
279
  var d = new Date(dateObj.getTime());
274
280
 
275
281
  d.setMonth(d.getMonth() + months);
@@ -277,12 +283,12 @@
277
283
  };
278
284
 
279
285
  /**
280
- * adding days
286
+ * Adding days
281
287
  * @param {Date} dateObj - a date object
282
288
  * @param {number} days - number of days to add
283
289
  * @returns {Date} a date after adding the value
284
290
  */
285
- date.addDays = function (dateObj, days) {
291
+ proto.addDays = function (dateObj, days) {
286
292
  var d = new Date(dateObj.getTime());
287
293
 
288
294
  d.setDate(d.getDate() + days);
@@ -290,52 +296,52 @@
290
296
  };
291
297
 
292
298
  /**
293
- * adding hours
299
+ * Adding hours
294
300
  * @param {Date} dateObj - a date object
295
301
  * @param {number} hours - number of hours to add
296
302
  * @returns {Date} a date after adding the value
297
303
  */
298
- date.addHours = function (dateObj, hours) {
299
- return date.addMinutes(dateObj, hours * 60);
304
+ proto.addHours = function (dateObj, hours) {
305
+ return this.addMinutes(dateObj, hours * 60);
300
306
  };
301
307
 
302
308
  /**
303
- * adding minutes
309
+ * Adding minutes
304
310
  * @param {Date} dateObj - a date object
305
311
  * @param {number} minutes - number of minutes to add
306
312
  * @returns {Date} a date after adding the value
307
313
  */
308
- date.addMinutes = function (dateObj, minutes) {
309
- return date.addSeconds(dateObj, minutes * 60);
314
+ proto.addMinutes = function (dateObj, minutes) {
315
+ return this.addSeconds(dateObj, minutes * 60);
310
316
  };
311
317
 
312
318
  /**
313
- * adding seconds
319
+ * Adding seconds
314
320
  * @param {Date} dateObj - a date object
315
321
  * @param {number} seconds - number of seconds to add
316
322
  * @returns {Date} a date after adding the value
317
323
  */
318
- date.addSeconds = function (dateObj, seconds) {
319
- return date.addMilliseconds(dateObj, seconds * 1000);
324
+ proto.addSeconds = function (dateObj, seconds) {
325
+ return this.addMilliseconds(dateObj, seconds * 1000);
320
326
  };
321
327
 
322
328
  /**
323
- * adding milliseconds
329
+ * Adding milliseconds
324
330
  * @param {Date} dateObj - a date object
325
331
  * @param {number} milliseconds - number of milliseconds to add
326
332
  * @returns {Date} a date after adding the value
327
333
  */
328
- date.addMilliseconds = function (dateObj, milliseconds) {
334
+ proto.addMilliseconds = function (dateObj, milliseconds) {
329
335
  return new Date(dateObj.getTime() + milliseconds);
330
336
  };
331
337
 
332
338
  /**
333
- * subtracting
339
+ * Subtracting two dates
334
340
  * @param {Date} date1 - a Date object
335
341
  * @param {Date} date2 - a Date object
336
342
  * @returns {Object} a result object subtracting date2 from date1
337
343
  */
338
- date.subtract = function (date1, date2) {
344
+ proto.subtract = function (date1, date2) {
339
345
  var delta = date1.getTime() - date2.getTime();
340
346
 
341
347
  return {
@@ -358,93 +364,111 @@
358
364
  };
359
365
 
360
366
  /**
361
- * leap year
367
+ * Whether year is leap year
362
368
  * @param {number} y - year
363
- * @returns {boolean} whether the year is a leap year
369
+ * @returns {boolean} whether year is leap year
364
370
  */
365
- date.isLeapYear = function (y) {
371
+ proto.isLeapYear = function (y) {
366
372
  return (!(y % 4) && !!(y % 100)) || !(y % 400);
367
373
  };
368
374
 
369
375
  /**
370
- * comparison of two dates
376
+ * Comparison of two dates
371
377
  * @param {Date} date1 - a Date object
372
378
  * @param {Date} date2 - a Date object
373
- * @returns {boolean} whether the dates are the same day (times are ignored)
379
+ * @returns {boolean} whether the two dates are the same day (time is ignored)
374
380
  */
375
- date.isSameDay = function (date1, date2) {
381
+ proto.isSameDay = function (date1, date2) {
376
382
  return date1.toDateString() === date2.toDateString();
377
383
  };
378
384
 
379
385
  /**
380
- * change locale or setting a new locale definition
381
- * @param {Function|string} [code] - locale function | language code
382
- * @param {Object} [locale] - locale definition
386
+ * Defining new locale
387
+ * @param {string} code - language code
388
+ * @param {Function} locale - locale installer
383
389
  * @returns {string} current language code
384
390
  */
385
- date.locale = function (code, locale) {
386
- if (locale) {
387
- customize(code, { res: _res, formatter: _formatter, parser: _parser }, locale);
388
- } else if (typeof code === 'function') {
389
- lang = code(date);
390
- } else if (code) {
391
- if (global && !global.date) {
392
- console.warn('This method of changing the locale is deprecated. See documentation for details.');
393
- }
394
- lang = code;
391
+ proto.locale = function (code, locale) {
392
+ if (!locales[code]) {
393
+ locales[code] = locale;
395
394
  }
395
+ };
396
+
397
+ /**
398
+ * Defining new plugin
399
+ * @param {string} name - plugin name
400
+ * @param {Function} plugin - plugin installer
401
+ * @returns {void}
402
+ */
403
+ proto.plugin = function (name, plugin) {
404
+ if (!plugins[name]) {
405
+ plugins[name] = plugin;
406
+ }
407
+ };
408
+
409
+ var localized_proto = extend(proto);
410
+ var date = extend(proto);
411
+
412
+ /**
413
+ * Changing locale
414
+ * @param {Function|string} [locale] - locale object | language code
415
+ * @returns {string} current language code
416
+ */
417
+ date.locale = function (locale) {
418
+ var install = typeof locale === 'function' ? locale : date.locale[locale];
419
+
420
+ if (!install) {
421
+ return lang;
422
+ }
423
+ lang = install(proto);
424
+
425
+ var extension = locales[lang] || {};
426
+ var res = extend(_res, extension.res, true);
427
+ var formatter = extend(_formatter, extension.formatter, true, res);
428
+ var parser = extend(_parser, extension.parser, true, res);
429
+
430
+ date._formatter = localized_proto._formatter = formatter;
431
+ date._parser = localized_proto._parser = parser;
432
+
433
+ for (var plugin in plugins) {
434
+ date.extend(plugins[plugin]);
435
+ }
436
+
396
437
  return lang;
397
438
  };
398
439
 
399
440
  /**
400
- * locale extension
401
- * @param {Object} extension - locale extension
441
+ * Feature extension
442
+ * @param {Object} extension - extension object
402
443
  * @returns {void}
403
444
  */
404
445
  date.extend = function (extension) {
446
+ var res = extend(date._parser.res, extension.res);
405
447
  var extender = extension.extender || {};
406
448
 
449
+ date._formatter = extend(date._formatter, extension.formatter, false, res);
450
+ date._parser = extend(date._parser, extension.parser, false, res);
451
+
407
452
  for (var key in extender) {
408
453
  if (!date[key]) {
409
454
  date[key] = extender[key];
410
455
  }
411
456
  }
412
- if (extension.formatter || extension.parser || extension.res) {
413
- customize(lang, locales[lang], extension);
414
- }
415
457
  };
416
458
 
417
459
  /**
418
- * plugin import or definition
419
- * @param {Function|string} plugin - plugin function | plugin name
420
- * @param {Object} [extension] - locale extension
460
+ * Importing plugin
461
+ * @param {Function|string} plugin - plugin object | plugin name
421
462
  * @returns {void}
422
463
  */
423
- date.plugin = function (plugin, extension) {
424
- if (typeof plugin === 'function') {
425
- date.extend(plugins[plugin(date)]);
426
- } else {
427
- plugins[plugin] = plugins[plugin] || extension;
428
- if (!extension && plugins[plugin]) {
429
- date.extend(plugins[plugin]);
430
- if (global && !global.date) {
431
- console.warn('This method of applying plugins is deprecated. See documentation for details.');
432
- }
433
- }
464
+ date.plugin = function (plugin) {
465
+ var install = typeof plugin === 'function' ? plugin : date.plugin[plugin];
466
+
467
+ if (install) {
468
+ date.extend(plugins[install(proto, localized_proto)] || {});
434
469
  }
435
470
  };
436
471
 
437
- // Create default locale (English)
438
- date.locale(lang, {});
439
-
440
- if (typeof module === 'object' && typeof module.exports === 'object') {
441
- module.exports = date;
442
- } else if (typeof define === 'function' && define.amd) {
443
- define([], function () {
444
- return date;
445
- });
446
- } else {
447
- global.date = date;
448
- }
472
+ return date;
449
473
 
450
- }(this));
474
+ }));
@@ -1,16 +1,16 @@
1
1
  /*
2
- date-and-time.js (c) KNOWLEDGECODE | MIT
2
+ date-and-time (c) KNOWLEDGECODE | MIT
3
3
  */
4
- (function(q){var d={},t={},r={},m="en",v={MMMM:"January February March April May June July August September October November December".split(" "),MMM:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),dddd:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ddd:"Sun Mon Tue Wed Thu Fri Sat".split(" "),dd:"Su Mo Tu We Th Fr Sa".split(" "),A:["AM","PM"]},w={YYYY:function(a){return("000"+a.getFullYear()).slice(-4)},YY:function(a){return("0"+a.getFullYear()).slice(-2)},Y:function(a){return""+
5
- a.getFullYear()},MMMM:function(a){return this.res.MMMM[a.getMonth()]},MMM:function(a){return this.res.MMM[a.getMonth()]},MM:function(a){return("0"+(a.getMonth()+1)).slice(-2)},M:function(a){return""+(a.getMonth()+1)},DD:function(a){return("0"+a.getDate()).slice(-2)},D:function(a){return""+a.getDate()},HH:function(a){return("0"+a.getHours()).slice(-2)},H:function(a){return""+a.getHours()},A:function(a){return this.res.A[11<a.getHours()|0]},hh:function(a){return("0"+(a.getHours()%12||12)).slice(-2)},
6
- h:function(a){return""+(a.getHours()%12||12)},mm:function(a){return("0"+a.getMinutes()).slice(-2)},m:function(a){return""+a.getMinutes()},ss:function(a){return("0"+a.getSeconds()).slice(-2)},s:function(a){return""+a.getSeconds()},SSS:function(a){return("00"+a.getMilliseconds()).slice(-3)},SS:function(a){return("0"+(a.getMilliseconds()/10|0)).slice(-2)},S:function(a){return""+(a.getMilliseconds()/100|0)},dddd:function(a){return this.res.dddd[a.getDay()]},ddd:function(a){return this.res.ddd[a.getDay()]},
7
- dd:function(a){return this.res.dd[a.getDay()]},Z:function(a){return a.utc?"+0000":/[\+-]\d{4}/.exec(a.toTimeString())[0]},post:function(a){return a}},x={YYYY:function(a){return this.exec(/^\d{4}/,a)},Y:function(a){return this.exec(/^\d{1,4}/,a)},MMMM:function(a){a=this.find(this.res.MMMM,a);a.value++;return a},MMM:function(a){a=this.find(this.res.MMM,a);a.value++;return a},MM:function(a){return this.exec(/^\d\d/,a)},M:function(a){return this.exec(/^\d\d?/,a)},DD:function(a){return this.exec(/^\d\d/,
8
- a)},D:function(a){return this.exec(/^\d\d?/,a)},HH:function(a){return this.exec(/^\d\d/,a)},H:function(a){return this.exec(/^\d\d?/,a)},A:function(a){return this.find(this.res.A,a)},hh:function(a){return this.exec(/^\d\d/,a)},h:function(a){return this.exec(/^\d\d?/,a)},mm:function(a){return this.exec(/^\d\d/,a)},m:function(a){return this.exec(/^\d\d?/,a)},ss:function(a){return this.exec(/^\d\d/,a)},s:function(a){return this.exec(/^\d\d?/,a)},SSS:function(a){return this.exec(/^\d{1,3}/,a)},SS:function(a){a=
9
- this.exec(/^\d\d?/,a);a.value*=10;return a},S:function(a){a=this.exec(/^\d/,a);a.value*=100;return a},Z:function(a){a=this.exec(/^[\+-]\d{2}[0-5]\d/,a);a.value=-60*(a.value/100|0)-a.value%100;return a},h12:function(a,c){return(12===a?0:a)+12*c},exec:function(a,c){var b=(a.exec(c)||[""])[0];return{value:b|0,length:b.length}},find:function(a,c){for(var b=-1,e=0,g=0,h=a.length,f;g<h;g++)f=a[g],!c.indexOf(f)&&f.length>e&&(b=g,e=f.length);return{value:b,length:e}},pre:function(a){return a}},u=function(a,
10
- c,b){var e=function(h,f,l){var p=function(n){n&&(this.res=n)};p.prototype=h;p.prototype.constructor=p;h=new p(l);for(var k in f||{})l=f[k],h[k]=l.slice?l.slice():l;return h},g={res:e(c.res,b.res)};g.formatter=e(c.formatter,b.formatter,g.res);g.parser=e(c.parser,b.parser,g.res);t[a]=g};d.compile=function(a){for(var c=/\[([^\[\]]|\[[^\[\]]*])*]|([A-Za-z])\2+|\.{3}|./g,b,e=[a];b=c.exec(a);)e[e.length]=b[0];return e};d.format=function(a,c,b){c="string"===typeof c?d.compile(c):c;a=d.addMinutes(a,b?a.getTimezoneOffset():
11
- 0);var e=t[m].formatter,g="";a.utc=b||!1;b=1;for(var h=c.length,f;b<h;b++)f=c[b],g+=e[f]?e.post(e[f](a,c[0])):f.replace(/\[(.*)]/,"$1");return g};d.preparse=function(a,c){var b="string"===typeof c?d.compile(c):c,e={Y:1970,M:1,D:1,H:0,A:0,h:0,m:0,s:0,S:0,Z:0,_index:0,_length:0,_match:0},g=/\[(.*)]/,h=t[m].parser,f=0;a=h.pre(a);for(var l=1,p=b.length,k,n;l<p;l++)if(k=b[l],h[k]){n=h[k](a.slice(f),b[0]);if(!n.length)break;f+=n.length;e[k.charAt(0)]=n.value;e._match++}else if(k===a.charAt(f)||" "===k)f++;
12
- else if(g.test(k)&&!a.slice(f).indexOf(g.exec(k)[1]))f+=k.length-2;else{"..."===k&&(f=a.length);break}e.H=e.H||h.h12(e.h,e.A);e._index=f;e._length=a.length;return e};d.isValid=function(a,c){var b="string"===typeof a?d.preparse(a,c):a,e=[31,28+d.isLeapYear(b.Y)|0,31,30,31,30,31,31,30,31,30,31][b.M-1];return!(1>b._index||1>b._length||b._index-b._length||1>b._match||1>b.Y||9999<b.Y||1>b.M||12<b.M||1>b.D||b.D>e||0>b.H||23<b.H||0>b.m||59<b.m||0>b.s||59<b.s||0>b.S||999<b.S||-720>b.Z||840<b.Z)};d.parse=
13
- function(a,c,b){a=d.preparse(a,c);return d.isValid(a)?(a.M-=100>a.Y?22801:1,b||a.Z?new Date(Date.UTC(a.Y,a.M,a.D,a.H,a.m+a.Z,a.s,a.S)):new Date(a.Y,a.M,a.D,a.H,a.m,a.s,a.S)):new Date(NaN)};d.transform=function(a,c,b,e){return d.format(d.parse(a,c),b,e)};d.addYears=function(a,c){return d.addMonths(a,12*c)};d.addMonths=function(a,c){var b=new Date(a.getTime());b.setMonth(b.getMonth()+c);return b};d.addDays=function(a,c){var b=new Date(a.getTime());b.setDate(b.getDate()+c);return b};d.addHours=function(a,
14
- c){return d.addMinutes(a,60*c)};d.addMinutes=function(a,c){return d.addSeconds(a,60*c)};d.addSeconds=function(a,c){return d.addMilliseconds(a,1E3*c)};d.addMilliseconds=function(a,c){return new Date(a.getTime()+c)};d.subtract=function(a,c){var b=a.getTime()-c.getTime();return{toMilliseconds:function(){return b},toSeconds:function(){return b/1E3},toMinutes:function(){return b/6E4},toHours:function(){return b/36E5},toDays:function(){return b/864E5}}};d.isLeapYear=function(a){return!(a%4)&&!!(a%100)||
15
- !(a%400)};d.isSameDay=function(a,c){return a.toDateString()===c.toDateString()};d.locale=function(a,c){c?u(a,{res:v,formatter:w,parser:x},c):"function"===typeof a?m=a(d):a&&(q&&!q.date&&console.warn("This method of changing the locale is deprecated. See documentation for details."),m=a);return m};d.extend=function(a){var c=a.extender||{},b;for(b in c)d[b]||(d[b]=c[b]);(a.formatter||a.parser||a.res)&&u(m,t[m],a)};d.plugin=function(a,c){"function"===typeof a?d.extend(r[a(d)]):(r[a]=r[a]||c,!c&&r[a]&&
16
- (d.extend(r[a]),q&&!q.date&&console.warn("This method of applying plugins is deprecated. See documentation for details.")))};d.locale(m,{});"object"===typeof module&&"object"===typeof module.exports?module.exports=d:"function"===typeof define&&define.amd?define([],function(){return d}):q.date=d})(this);
4
+ 'use strict';(function(n,l){"object"===typeof exports&&"undefined"!==typeof module?module.exports=l():"function"===typeof define&&define.amd?define(l):(n="undefined"!==typeof globalThis?globalThis:n||self,n.date=l())})(this,function(){var n={},l={},q="en",t={MMMM:"January February March April May June July August September October November December".split(" "),MMM:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),dddd:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),
5
+ ddd:"Sun Mon Tue Wed Thu Fri Sat".split(" "),dd:"Su Mo Tu We Th Fr Sa".split(" "),A:["AM","PM"]},w={YYYY:function(a){return("000"+a.getFullYear()).slice(-4)},YY:function(a){return("0"+a.getFullYear()).slice(-2)},Y:function(a){return""+a.getFullYear()},MMMM:function(a){return this.res.MMMM[a.getMonth()]},MMM:function(a){return this.res.MMM[a.getMonth()]},MM:function(a){return("0"+(a.getMonth()+1)).slice(-2)},M:function(a){return""+(a.getMonth()+1)},DD:function(a){return("0"+a.getDate()).slice(-2)},
6
+ D:function(a){return""+a.getDate()},HH:function(a){return("0"+a.getHours()).slice(-2)},H:function(a){return""+a.getHours()},A:function(a){return this.res.A[11<a.getHours()|0]},hh:function(a){return("0"+(a.getHours()%12||12)).slice(-2)},h:function(a){return""+(a.getHours()%12||12)},mm:function(a){return("0"+a.getMinutes()).slice(-2)},m:function(a){return""+a.getMinutes()},ss:function(a){return("0"+a.getSeconds()).slice(-2)},s:function(a){return""+a.getSeconds()},SSS:function(a){return("00"+a.getMilliseconds()).slice(-3)},
7
+ SS:function(a){return("0"+(a.getMilliseconds()/10|0)).slice(-2)},S:function(a){return""+(a.getMilliseconds()/100|0)},dddd:function(a){return this.res.dddd[a.getDay()]},ddd:function(a){return this.res.ddd[a.getDay()]},dd:function(a){return this.res.dd[a.getDay()]},Z:function(a){a=a.getTimezoneOffset()/.6|0;return(0<a?"-":"+")+("000"+Math.abs(a-(a%100*.4|0))).slice(-4)},post:function(a){return a},res:t},x={YYYY:function(a){return this.exec(/^\d{4}/,a)},Y:function(a){return this.exec(/^\d{1,4}/,a)},
8
+ MMMM:function(a){a=this.find(this.res.MMMM,a);a.value++;return a},MMM:function(a){a=this.find(this.res.MMM,a);a.value++;return a},MM:function(a){return this.exec(/^\d\d/,a)},M:function(a){return this.exec(/^\d\d?/,a)},DD:function(a){return this.exec(/^\d\d/,a)},D:function(a){return this.exec(/^\d\d?/,a)},HH:function(a){return this.exec(/^\d\d/,a)},H:function(a){return this.exec(/^\d\d?/,a)},A:function(a){return this.find(this.res.A,a)},hh:function(a){return this.exec(/^\d\d/,a)},h:function(a){return this.exec(/^\d\d?/,
9
+ a)},mm:function(a){return this.exec(/^\d\d/,a)},m:function(a){return this.exec(/^\d\d?/,a)},ss:function(a){return this.exec(/^\d\d/,a)},s:function(a){return this.exec(/^\d\d?/,a)},SSS:function(a){return this.exec(/^\d{1,3}/,a)},SS:function(a){a=this.exec(/^\d\d?/,a);a.value*=10;return a},S:function(a){a=this.exec(/^\d/,a);a.value*=100;return a},Z:function(a){a=this.exec(/^[\+-]\d{2}[0-5]\d/,a);a.value=-60*(a.value/100|0)-a.value%100;return a},h12:function(a,b){return(12===a?0:a)+12*b},exec:function(a,
10
+ b){a=(a.exec(b)||[""])[0];return{value:a|0,length:a.length}},find:function(a,b){for(var c=-1,d=0,f=0,e=a.length,k;f<e;f++)k=a[f],!b.indexOf(k)&&k.length>d&&(c=f,d=k.length);return{value:c,length:d}},pre:function(a){return a},res:t},m=function(a,b,c,d){var f={},e;for(e in a)f[e]=a[e];for(e in b||{})!!c^!!f[e]||(f[e]=b[e]);d&&(f.res=d);return f},r={_formatter:w,_parser:x,compile:function(a){for(var b=/\[([^\[\]]|\[[^\[\]]*])*]|([A-Za-z])\2+|\.{3}|./g,c,d=[a];c=b.exec(a);)d[d.length]=c[0];return d},
11
+ format:function(a,b,c){b="string"===typeof b?this.compile(b):b;var d=a.getTimezoneOffset();a=this.addMinutes(a,c?d:0);var f=this._formatter,e="";a.getTimezoneOffset=function(){return c?0:d};for(var k=1,u=b.length,h;k<u;k++)h=b[k],e+=f[h]?f.post(f[h](a,b[0])):h.replace(/\[(.*)]/,"$1");return e},preparse:function(a,b){b="string"===typeof b?this.compile(b):b;var c={Y:1970,M:1,D:1,H:0,A:0,h:0,m:0,s:0,S:0,Z:0,_index:0,_length:0,_match:0},d=/\[(.*)]/,f=this._parser,e=0;a=f.pre(a);for(var k=1,u=b.length,
12
+ h,p;k<u;k++)if(h=b[k],f[h]){p=f[h](a.slice(e),b[0]);if(!p.length)break;e+=p.length;c[p.token||h.charAt(0)]=p.value;c._match++}else if(h===a.charAt(e)||" "===h)e++;else if(d.test(h)&&!a.slice(e).indexOf(d.exec(h)[1]))e+=h.length-2;else{"..."===h&&(e=a.length);break}c.H=c.H||f.h12(c.h,c.A);c._index=e;c._length=a.length;return c},parse:function(a,b,c){a=this.preparse(a,b);return this.isValid(a)?(a.M-=100>a.Y?22801:1,c||a.Z?new Date(Date.UTC(a.Y,a.M,a.D,a.H,a.m+a.Z,a.s,a.S)):new Date(a.Y,a.M,a.D,a.H,
13
+ a.m,a.s,a.S)):new Date(NaN)},isValid:function(a,b){a="string"===typeof a?this.preparse(a,b):a;b=[31,28+this.isLeapYear(a.Y)|0,31,30,31,30,31,31,30,31,30,31][a.M-1];return!(1>a._index||1>a._length||a._index-a._length||1>a._match||1>a.Y||9999<a.Y||1>a.M||12<a.M||1>a.D||a.D>b||0>a.H||23<a.H||0>a.m||59<a.m||0>a.s||59<a.s||0>a.S||999<a.S||-720>a.Z||840<a.Z)},transform:function(a,b,c,d){return this.format(this.parse(a,b),c,d)},addYears:function(a,b){return this.addMonths(a,12*b)},addMonths:function(a,b){a=
14
+ new Date(a.getTime());a.setMonth(a.getMonth()+b);return a},addDays:function(a,b){a=new Date(a.getTime());a.setDate(a.getDate()+b);return a},addHours:function(a,b){return this.addMinutes(a,60*b)},addMinutes:function(a,b){return this.addSeconds(a,60*b)},addSeconds:function(a,b){return this.addMilliseconds(a,1E3*b)},addMilliseconds:function(a,b){return new Date(a.getTime()+b)},subtract:function(a,b){var c=a.getTime()-b.getTime();return{toMilliseconds:function(){return c},toSeconds:function(){return c/
15
+ 1E3},toMinutes:function(){return c/6E4},toHours:function(){return c/36E5},toDays:function(){return c/864E5}}},isLeapYear:function(a){return!(a%4)&&!!(a%100)||!(a%400)},isSameDay:function(a,b){return a.toDateString()===b.toDateString()},locale:function(a,b){n[a]||(n[a]=b)},plugin:function(a,b){l[a]||(l[a]=b)}},v=m(r),g=m(r);g.locale=function(a){a="function"===typeof a?a:g.locale[a];if(!a)return q;q=a(r);var b=n[q]||{},c=m(t,b.res,!0);a=m(w,b.formatter,!0,c);b=m(x,b.parser,!0,c);g._formatter=v._formatter=
16
+ a;g._parser=v._parser=b;for(var d in l)g.extend(l[d]);return q};g.extend=function(a){var b=m(g._parser.res,a.res),c=a.extender||{};g._formatter=m(g._formatter,a.formatter,!1,b);g._parser=m(g._parser,a.parser,!1,b);for(var d in c)g[d]||(g[d]=c[d])};g.plugin=function(a){(a="function"===typeof a?a:g.plugin[a])&&g.extend(l[a(r,v)]||{})};return g})