datevolt 1.0.0
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.
- package/LICENSE +21 -0
- package/README.md +339 -0
- package/package.json +57 -0
- package/src/duration.js +188 -0
- package/src/index.js +150 -0
- package/src/locale.js +179 -0
- package/src/parse.js +335 -0
- package/src/tempox.js +456 -0
package/src/index.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* tempox - A complete, lightweight, zero-dependency date library
|
|
5
|
+
* with a moment.js-compatible chainable API.
|
|
6
|
+
*
|
|
7
|
+
* Usage (drop-in moment replacement):
|
|
8
|
+
* const tempox = require('tempox');
|
|
9
|
+
* tempox().format('YYYY-MM-DD');
|
|
10
|
+
* tempox('2024-01-15').add(1,'month').fromNow();
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
var Tempox = require('./tempox');
|
|
14
|
+
var Duration = require('./duration');
|
|
15
|
+
var localeModule = require('./locale');
|
|
16
|
+
|
|
17
|
+
// ─── Factory function ─────────────────────────────────────────────────────────
|
|
18
|
+
function tempox(input, fmt, strict) {
|
|
19
|
+
return new Tempox(input, fmt, strict, false, undefined);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// ─── UTC factory ──────────────────────────────────────────────────────────────
|
|
23
|
+
tempox.utc = function(input, fmt, strict) {
|
|
24
|
+
return new Tempox(input, fmt, strict, true, undefined);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// ─── Unix factories ──────────────────────────────────────────────────────────
|
|
28
|
+
tempox.unix = function(ts) {
|
|
29
|
+
return new Tempox(ts * 1000);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// ─── Clone / check ────────────────────────────────────────────────────────────
|
|
33
|
+
tempox.isMoment = tempox.isTempox = function(obj) {
|
|
34
|
+
return !!(obj && obj.__isTempox);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
tempox.isDate = function(d) {
|
|
38
|
+
return d instanceof Date;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// ─── Duration factory ─────────────────────────────────────────────────────────
|
|
42
|
+
tempox.duration = function(input, unit) {
|
|
43
|
+
return new Duration(input, unit);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
tempox.isDuration = function(d) {
|
|
47
|
+
return !!(d && d.__isDuration);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// ─── Min / Max ────────────────────────────────────────────────────────────────
|
|
51
|
+
tempox.max = function() {
|
|
52
|
+
var args = Array.isArray(arguments[0]) ? arguments[0] : Array.prototype.slice.call(arguments);
|
|
53
|
+
if (!args.length) return tempox.invalid();
|
|
54
|
+
return args.reduce(function(best, cur) {
|
|
55
|
+
var c = cur instanceof Tempox ? cur : new Tempox(cur);
|
|
56
|
+
return c.valueOf() > best.valueOf() ? c : best;
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
tempox.min = function() {
|
|
61
|
+
var args = Array.isArray(arguments[0]) ? arguments[0] : Array.prototype.slice.call(arguments);
|
|
62
|
+
if (!args.length) return tempox.invalid();
|
|
63
|
+
return args.reduce(function(best, cur) {
|
|
64
|
+
var c = cur instanceof Tempox ? cur : new Tempox(cur);
|
|
65
|
+
return c.valueOf() < best.valueOf() ? c : best;
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// ─── Invalid moment ───────────────────────────────────────────────────────────
|
|
70
|
+
tempox.invalid = function(flags) {
|
|
71
|
+
return new Tempox(NaN);
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// ─── Utilities ────────────────────────────────────────────────────────────────
|
|
75
|
+
tempox.normalizeUnits = function(unit) {
|
|
76
|
+
var MAP = {
|
|
77
|
+
year:'year',years:'year',y:'year',
|
|
78
|
+
month:'month',months:'month',M:'month',
|
|
79
|
+
week:'week',weeks:'week',w:'week',
|
|
80
|
+
day:'day',days:'day',d:'day',
|
|
81
|
+
hour:'hour',hours:'hour',h:'hour',
|
|
82
|
+
minute:'minute',minutes:'minute',m:'minute',
|
|
83
|
+
second:'second',seconds:'second',s:'second',
|
|
84
|
+
millisecond:'millisecond',milliseconds:'millisecond',ms:'millisecond'
|
|
85
|
+
};
|
|
86
|
+
return MAP[unit] || unit;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// ─── Locale API ──────────────────────────────────────────────────────────────
|
|
90
|
+
tempox.locale = function(loc, def) {
|
|
91
|
+
if (loc === undefined) return localeModule.getGlobalLocale();
|
|
92
|
+
if (def) localeModule.defineLocale(loc, def);
|
|
93
|
+
localeModule.setGlobalLocale(loc);
|
|
94
|
+
return localeModule.getGlobalLocale();
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
tempox.defineLocale = function(name, config) {
|
|
98
|
+
return localeModule.defineLocale(name, config);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
tempox.updateLocale = function(name, config) {
|
|
102
|
+
var existing = localeModule.getLocale(name) || {};
|
|
103
|
+
for (var k in config) {
|
|
104
|
+
if (Object.prototype.hasOwnProperty.call(config, k)) existing[k] = config[k];
|
|
105
|
+
}
|
|
106
|
+
localeModule.defineLocale(name, existing);
|
|
107
|
+
return existing;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
tempox.locales = function() {
|
|
111
|
+
return localeModule.listLocales();
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
tempox.localeData = function(loc) {
|
|
115
|
+
return localeModule.getLocale(loc || localeModule.getGlobalLocale());
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
// ─── Relative time config ────────────────────────────────────────────────────
|
|
119
|
+
var _relativeThresholds = {
|
|
120
|
+
ss: 44, s: 45, m: 45, mm: 89, h: 22, hh: 21, d: 26, dd: 25, w: null, ww: null, M: 45, MM: 319, y: 548
|
|
121
|
+
};
|
|
122
|
+
var _relativeRounding = Math.round;
|
|
123
|
+
|
|
124
|
+
tempox.relativeTimeThreshold = function(unit, threshold) {
|
|
125
|
+
if (threshold === undefined) return _relativeThresholds[unit];
|
|
126
|
+
_relativeThresholds[unit] = threshold;
|
|
127
|
+
return true;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
tempox.relativeTimeRounding = function(fn) {
|
|
131
|
+
if (fn === undefined) return _relativeRounding;
|
|
132
|
+
_relativeRounding = fn;
|
|
133
|
+
return true;
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
// ─── Now override (for testing) ──────────────────────────────────────────────
|
|
137
|
+
var _nowFn = null;
|
|
138
|
+
tempox.now = function() {
|
|
139
|
+
return _nowFn ? _nowFn() : Date.now();
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
// ─── Version ─────────────────────────────────────────────────────────────────
|
|
143
|
+
tempox.version = require('../package.json').version;
|
|
144
|
+
|
|
145
|
+
// ─── Classes exposed for extension ───────────────────────────────────────────
|
|
146
|
+
tempox.fn = Tempox.prototype;
|
|
147
|
+
tempox.Tempox = Tempox;
|
|
148
|
+
tempox.Duration = Duration;
|
|
149
|
+
|
|
150
|
+
module.exports = tempox;
|
package/src/locale.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// ─── Default English Locale ───────────────────────────────────────────────────
|
|
4
|
+
var en = {
|
|
5
|
+
name: 'en',
|
|
6
|
+
months: ['January','February','March','April','May','June','July','August','September','October','November','December'],
|
|
7
|
+
monthsShort: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
|
|
8
|
+
weekdays: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
|
|
9
|
+
weekdaysShort: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],
|
|
10
|
+
weekdaysMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
|
|
11
|
+
longDateFormat: {
|
|
12
|
+
LT: 'h:mm A', LTS: 'h:mm:ss A',
|
|
13
|
+
L: 'MM/DD/YYYY', LL: 'MMMM D, YYYY',
|
|
14
|
+
LLL: 'MMMM D, YYYY h:mm A', LLLL: 'dddd, MMMM D, YYYY h:mm A'
|
|
15
|
+
},
|
|
16
|
+
calendar: {
|
|
17
|
+
sameDay: '[Today at] LT',
|
|
18
|
+
nextDay: '[Tomorrow at] LT',
|
|
19
|
+
nextWeek: 'dddd [at] LT',
|
|
20
|
+
lastDay: '[Yesterday at] LT',
|
|
21
|
+
lastWeek: '[Last] dddd [at] LT',
|
|
22
|
+
sameElse: 'L'
|
|
23
|
+
},
|
|
24
|
+
relativeTime: {
|
|
25
|
+
future: 'in %s',
|
|
26
|
+
past: '%s ago',
|
|
27
|
+
s: 'a few seconds', ss: '%d seconds',
|
|
28
|
+
m: 'a minute', mm: '%d minutes',
|
|
29
|
+
h: 'an hour', hh: '%d hours',
|
|
30
|
+
d: 'a day', dd: '%d days',
|
|
31
|
+
w: 'a week', ww: '%d weeks',
|
|
32
|
+
M: 'a month', MM: '%d months',
|
|
33
|
+
y: 'a year', yy: '%d years'
|
|
34
|
+
},
|
|
35
|
+
ordinal: function(n) {
|
|
36
|
+
var s=['th','st','nd','rd'], v=n%100;
|
|
37
|
+
return n+(s[(v-20)%10]||s[v]||s[0]);
|
|
38
|
+
},
|
|
39
|
+
week: { dow: 0, doy: 6 },
|
|
40
|
+
meridiem: function(h, m, isLower) {
|
|
41
|
+
return h < 12 ? (isLower ? 'am' : 'AM') : (isLower ? 'pm' : 'PM');
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// ─── Hindi Locale ─────────────────────────────────────────────────────────────
|
|
46
|
+
var hi = {
|
|
47
|
+
name: 'hi',
|
|
48
|
+
months: ['जनवरी','फ़रवरी','मार्च','अप्रैल','मई','जून','जुलाई','अगस्त','सितंबर','अक्टूबर','नवंबर','दिसंबर'],
|
|
49
|
+
monthsShort: ['जन.','फ़र.','मार्च','अप्रै.','मई','जून','जुल.','अग.','सित.','अक्टू.','नव.','दिस.'],
|
|
50
|
+
weekdays: ['रविवार','सोमवार','मंगलवार','बुधवार','गुरूवार','शुक्रवार','शनिवार'],
|
|
51
|
+
weekdaysShort: ['रवि','सोम','मंगल','बुध','गुरू','शुक्र','शनि'],
|
|
52
|
+
weekdaysMin: ['र','सो','मं','बु','गु','शु','श'],
|
|
53
|
+
longDateFormat: { LT:'A h:mm बजे', LTS:'A h:mm:ss बजे', L:'DD/MM/YYYY', LL:'D MMMM YYYY', LLL:'D MMMM YYYY, A h:mm बजे', LLLL:'dddd, D MMMM YYYY, A h:mm बजे' },
|
|
54
|
+
calendar: { sameDay:'[आज] LT', nextDay:'[कल] LT', nextWeek:'dddd[,] LT', lastDay:'[कल] LT', lastWeek:'[पिछले] dddd[,] LT', sameElse:'L' },
|
|
55
|
+
relativeTime: { future:'%s में', past:'%s पहले', s:'कुछ ही क्षण', ss:'%d सेकंड', m:'एक मिनट', mm:'%d मिनट', h:'एक घंटा', hh:'%d घंटे', d:'एक दिन', dd:'%d दिन', w:'एक सप्ताह', ww:'%d सप्ताह', M:'एक महीने', MM:'%d महीने', y:'एक वर्ष', yy:'%d वर्ष' },
|
|
56
|
+
ordinal: function(n) { return n; },
|
|
57
|
+
week: { dow: 0, doy: 6 },
|
|
58
|
+
meridiem: function(h) { if(h<4) return 'रात'; if(h<10) return 'सुबह'; if(h<17) return 'दोपहर'; if(h<20) return 'शाम'; return 'रात'; }
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// ─── Spanish Locale ───────────────────────────────────────────────────────────
|
|
62
|
+
var es = {
|
|
63
|
+
name: 'es',
|
|
64
|
+
months: ['enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre'],
|
|
65
|
+
monthsShort: ['ene.','feb.','mar.','abr.','may.','jun.','jul.','ago.','sep.','oct.','nov.','dic.'],
|
|
66
|
+
weekdays: ['domingo','lunes','martes','miércoles','jueves','viernes','sábado'],
|
|
67
|
+
weekdaysShort: ['dom.','lun.','mar.','mié.','jue.','vie.','sáb.'],
|
|
68
|
+
weekdaysMin: ['do','lu','ma','mi','ju','vi','sá'],
|
|
69
|
+
longDateFormat: { LT:'H:mm', LTS:'H:mm:ss', L:'DD/MM/YYYY', LL:'D [de] MMMM [de] YYYY', LLL:'D [de] MMMM [de] YYYY H:mm', LLLL:'dddd, D [de] MMMM [de] YYYY H:mm' },
|
|
70
|
+
calendar: { sameDay:'[hoy a la' , nextDay:'[mañana a la', nextWeek:'dddd [a la', lastDay:'[ayer a la', lastWeek:'[el] dddd [pasado a la', sameElse:'L' },
|
|
71
|
+
relativeTime: { future:'en %s', past:'hace %s', s:'unos segundos', ss:'%d segundos', m:'un minuto', mm:'%d minutos', h:'una hora', hh:'%d horas', d:'un día', dd:'%d días', w:'una semana', ww:'%d semanas', M:'un mes', MM:'%d meses', y:'un año', yy:'%d años' },
|
|
72
|
+
ordinal: function(n) { return n+'º'; },
|
|
73
|
+
week: { dow: 1, doy: 4 },
|
|
74
|
+
meridiem: function(h,m,isLower) { return h<12?(isLower?'am':'AM'):(isLower?'pm':'PM'); }
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// ─── French ──────────────────────────────────────────────────────────────────
|
|
78
|
+
var fr = {
|
|
79
|
+
name: 'fr',
|
|
80
|
+
months: ['janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre'],
|
|
81
|
+
monthsShort: ['janv.','févr.','mars','avr.','mai','juin','juil.','août','sept.','oct.','nov.','déc.'],
|
|
82
|
+
weekdays: ['dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi'],
|
|
83
|
+
weekdaysShort: ['dim.','lun.','mar.','mer.','jeu.','ven.','sam.'],
|
|
84
|
+
weekdaysMin: ['di','lu','ma','me','je','ve','sa'],
|
|
85
|
+
longDateFormat: { LT:'HH:mm', LTS:'HH:mm:ss', L:'DD/MM/YYYY', LL:'D MMMM YYYY', LLL:'D MMMM YYYY HH:mm', LLLL:'dddd D MMMM YYYY HH:mm' },
|
|
86
|
+
calendar: { sameDay:"[Aujourd'hui à] LT", nextDay:'[Demain à] LT', nextWeek:'dddd [à] LT', lastDay:'[Hier à] LT', lastWeek:'dddd [dernier à] LT', sameElse:'L' },
|
|
87
|
+
relativeTime: { future:'dans %s', past:'il y a %s', s:'quelques secondes', ss:'%d secondes', m:'une minute', mm:'%d minutes', h:'une heure', hh:'%d heures', d:'un jour', dd:'%d jours', w:'une semaine', ww:'%d semaines', M:'un mois', MM:'%d mois', y:'un an', yy:'%d ans' },
|
|
88
|
+
ordinal: function(n) { return n+(n===1?'er':'e'); },
|
|
89
|
+
week: { dow: 1, doy: 4 },
|
|
90
|
+
meridiem: function(h,m,isLower) { return h<12?(isLower?'am':'AM'):(isLower?'pm':'PM'); }
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// ─── German ───────────────────────────────────────────────────────────────────
|
|
94
|
+
var de = {
|
|
95
|
+
name: 'de',
|
|
96
|
+
months: ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'],
|
|
97
|
+
monthsShort: ['Jan.','Feb.','März','Apr.','Mai','Juni','Juli','Aug.','Sep.','Okt.','Nov.','Dez.'],
|
|
98
|
+
weekdays: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
|
|
99
|
+
weekdaysShort: ['So.','Mo.','Di.','Mi.','Do.','Fr.','Sa.'],
|
|
100
|
+
weekdaysMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
|
|
101
|
+
longDateFormat: { LT:'HH:mm', LTS:'HH:mm:ss', L:'DD.MM.YYYY', LL:'D. MMMM YYYY', LLL:'D. MMMM YYYY HH:mm', LLLL:'dddd, D. MMMM YYYY HH:mm' },
|
|
102
|
+
calendar: { sameDay:'[heute um] LT [Uhr]', nextDay:'[morgen um] LT [Uhr]', nextWeek:'dddd [um] LT [Uhr]', lastDay:'[gestern um] LT [Uhr]', lastWeek:'[letzten] dddd [um] LT [Uhr]', sameElse:'L' },
|
|
103
|
+
relativeTime: { future:'in %s', past:'vor %s', s:'ein paar Sekunden', ss:'%d Sekunden', m:'einer Minute', mm:'%d Minuten', h:'einer Stunde', hh:'%d Stunden', d:'einem Tag', dd:'%d Tagen', w:'einer Woche', ww:'%d Wochen', M:'einem Monat', MM:'%d Monaten', y:'einem Jahr', yy:'%d Jahren' },
|
|
104
|
+
ordinal: function(n) { return n+'.'; },
|
|
105
|
+
week: { dow: 1, doy: 4 },
|
|
106
|
+
meridiem: function(h,m,isLower) { return h<12?(isLower?'am':'AM'):(isLower?'pm':'PM'); }
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// ─── Arabic ───────────────────────────────────────────────────────────────────
|
|
110
|
+
var ar = {
|
|
111
|
+
name: 'ar',
|
|
112
|
+
months: ['يناير','فبراير','مارس','أبريل','مايو','يونيو','يوليو','أغسطس','سبتمبر','أكتوبر','نوفمبر','ديسمبر'],
|
|
113
|
+
monthsShort: ['يناير','فبراير','مارس','أبريل','مايو','يونيو','يوليو','أغسطس','سبتمبر','أكتوبر','نوفمبر','ديسمبر'],
|
|
114
|
+
weekdays: ['الأحد','الاثنين','الثلاثاء','الأربعاء','الخميس','الجمعة','السبت'],
|
|
115
|
+
weekdaysShort: ['أحد','اثنين','ثلاثاء','أربعاء','خميس','جمعة','سبت'],
|
|
116
|
+
weekdaysMin: ['ح','ن','ث','ر','خ','ج','س'],
|
|
117
|
+
longDateFormat: { LT:'HH:mm', LTS:'HH:mm:ss', L:'DD/MM/YYYY', LL:'D MMMM YYYY', LLL:'D MMMM YYYY HH:mm', LLLL:'dddd D MMMM YYYY HH:mm' },
|
|
118
|
+
calendar: { sameDay:'[اليوم عند الساعة] LT', nextDay:'[غدًا عند الساعة] LT', nextWeek:'dddd [عند الساعة] LT', lastDay:'[أمس عند الساعة] LT', lastWeek:'dddd [عند الساعة] LT', sameElse:'L' },
|
|
119
|
+
relativeTime: { future:'في %s', past:'منذ %s', s:'ثوان', ss:'%d ثانية', m:'دقيقة', mm:'%d دقائق', h:'ساعة', hh:'%d ساعات', d:'يوم', dd:'%d أيام', w:'أسبوع', ww:'%d أسابيع', M:'شهر', MM:'%d أشهر', y:'سنة', yy:'%d سنوات' },
|
|
120
|
+
ordinal: function(n) { return n; },
|
|
121
|
+
week: { dow: 6, doy: 12 },
|
|
122
|
+
meridiem: function(h,m,isLower) { return h<12?(isLower?'ص':'ص'):(isLower?'م':'م'); }
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
// ─── Japanese ─────────────────────────────────────────────────────────────────
|
|
126
|
+
var ja = {
|
|
127
|
+
name: 'ja',
|
|
128
|
+
months: ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
|
|
129
|
+
monthsShort: ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],
|
|
130
|
+
weekdays: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'],
|
|
131
|
+
weekdaysShort: ['日','月','火','水','木','金','土'],
|
|
132
|
+
weekdaysMin: ['日','月','火','水','木','金','土'],
|
|
133
|
+
longDateFormat: { LT:'HH:mm', LTS:'HH:mm:ss', L:'YYYY/MM/DD', LL:'YYYY年M月D日', LLL:'YYYY年M月D日 HH:mm', LLLL:'YYYY年M月D日 dddd HH:mm' },
|
|
134
|
+
calendar: { sameDay:'[今日] LT', nextDay:'[明日] LT', nextWeek:'[来週]dddd LT', lastDay:'[昨日] LT', lastWeek:'[前週]dddd LT', sameElse:'L' },
|
|
135
|
+
relativeTime: { future:'%s後', past:'%s前', s:'数秒', ss:'%d秒', m:'1分', mm:'%d分', h:'1時間', hh:'%d時間', d:'1日', dd:'%d日', w:'1週間', ww:'%d週間', M:'1ヶ月', MM:'%dヶ月', y:'1年', yy:'%d年' },
|
|
136
|
+
ordinal: function(n) { return n; },
|
|
137
|
+
week: { dow: 0, doy: 6 },
|
|
138
|
+
meridiem: function(h) { return h<12?'午前':'午後'; }
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
// ─── Locale Registry ─────────────────────────────────────────────────────────
|
|
142
|
+
var locales = { en: en, hi: hi, es: es, fr: fr, de: de, ar: ar, ja: ja };
|
|
143
|
+
var globalLocale = 'en';
|
|
144
|
+
|
|
145
|
+
function getLocale(name) {
|
|
146
|
+
return locales[name] || locales['en'];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function setGlobalLocale(name) {
|
|
150
|
+
if (locales[name]) globalLocale = name;
|
|
151
|
+
return globalLocale;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function getGlobalLocale() {
|
|
155
|
+
return globalLocale;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function getGlobalLocaleData() {
|
|
159
|
+
return locales[globalLocale];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function defineLocale(name, config) {
|
|
163
|
+
locales[name] = config;
|
|
164
|
+
config.name = name;
|
|
165
|
+
return config;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function listLocales() {
|
|
169
|
+
return Object.keys(locales);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
module.exports = {
|
|
173
|
+
getLocale: getLocale,
|
|
174
|
+
setGlobalLocale: setGlobalLocale,
|
|
175
|
+
getGlobalLocale: getGlobalLocale,
|
|
176
|
+
getGlobalLocaleData: getGlobalLocaleData,
|
|
177
|
+
defineLocale: defineLocale,
|
|
178
|
+
listLocales: listLocales
|
|
179
|
+
};
|
package/src/parse.js
ADDED
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
4
|
+
var ISO_REGEX = /^(\d{4})(-(\d{2})(-(\d{2})([T\s](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|([+-])(\d{2}):?(\d{2}))?)?)?)?$/;
|
|
5
|
+
var ASP_DATE_REGEX = /\/Date\((-?\d+)(([+-])(\d{2})(\d{2}))?\)\//;
|
|
6
|
+
|
|
7
|
+
var TOKEN_REGEX = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|jj?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
|
|
8
|
+
|
|
9
|
+
var FORMAT_TOKENS = {
|
|
10
|
+
M: function(d){ return d.getMonth()+1; },
|
|
11
|
+
MM: function(d){ return pad(d.getMonth()+1); },
|
|
12
|
+
MMM: function(d,loc){ return loc.monthsShort[d.getMonth()]; },
|
|
13
|
+
MMMM: function(d,loc){ return loc.months[d.getMonth()]; },
|
|
14
|
+
D: function(d){ return d.getDate(); },
|
|
15
|
+
DD: function(d){ return pad(d.getDate()); },
|
|
16
|
+
Do: function(d,loc){ return loc.ordinal(d.getDate()); },
|
|
17
|
+
DDD: function(d){ return dayOfYear(d); },
|
|
18
|
+
DDDD: function(d){ return pad(dayOfYear(d),3); },
|
|
19
|
+
d: function(d){ return d.getDay(); },
|
|
20
|
+
dd: function(d,loc){ return loc.weekdaysMin[d.getDay()]; },
|
|
21
|
+
ddd: function(d,loc){ return loc.weekdaysShort[d.getDay()]; },
|
|
22
|
+
dddd: function(d,loc){ return loc.weekdays[d.getDay()]; },
|
|
23
|
+
e: function(d){ return d.getDay(); },
|
|
24
|
+
E: function(d){ return d.getDay()||7; },
|
|
25
|
+
w: function(d){ return weekOfYear(d); },
|
|
26
|
+
ww: function(d){ return pad(weekOfYear(d)); },
|
|
27
|
+
W: function(d){ return isoWeekOfYear(d); },
|
|
28
|
+
WW: function(d){ return pad(isoWeekOfYear(d)); },
|
|
29
|
+
YY: function(d){ return String(d.getFullYear()).slice(-2); },
|
|
30
|
+
YYYY: function(d){ return pad(d.getFullYear(),4); },
|
|
31
|
+
gg: function(d){ return String(weekYear(d)).slice(-2); },
|
|
32
|
+
gggg: function(d){ return weekYear(d); },
|
|
33
|
+
GG: function(d){ return String(isoWeekYear(d)).slice(-2); },
|
|
34
|
+
GGGG: function(d){ return isoWeekYear(d); },
|
|
35
|
+
Q: function(d){ return Math.ceil((d.getMonth()+1)/3); },
|
|
36
|
+
Qo: function(d,loc){ return loc.ordinal(Math.ceil((d.getMonth()+1)/3)); },
|
|
37
|
+
A: function(d){ return d.getHours()<12?'AM':'PM'; },
|
|
38
|
+
a: function(d){ return d.getHours()<12?'am':'pm'; },
|
|
39
|
+
H: function(d){ return d.getHours(); },
|
|
40
|
+
HH: function(d){ return pad(d.getHours()); },
|
|
41
|
+
h: function(d){ return d.getHours()%12||12; },
|
|
42
|
+
hh: function(d){ return pad(d.getHours()%12||12); },
|
|
43
|
+
k: function(d){ return d.getHours()||24; },
|
|
44
|
+
kk: function(d){ return pad(d.getHours()||24); },
|
|
45
|
+
m: function(d){ return d.getMinutes(); },
|
|
46
|
+
mm: function(d){ return pad(d.getMinutes()); },
|
|
47
|
+
s: function(d){ return d.getSeconds(); },
|
|
48
|
+
ss: function(d){ return pad(d.getSeconds()); },
|
|
49
|
+
S: function(d){ return Math.floor(d.getMilliseconds()/100); },
|
|
50
|
+
SS: function(d){ return pad(Math.floor(d.getMilliseconds()/10)); },
|
|
51
|
+
SSS: function(d){ return pad(d.getMilliseconds(),3); },
|
|
52
|
+
SSSS: function(d){ return pad(d.getMilliseconds(),3)+'0'; },
|
|
53
|
+
SSSSS:function(d){ return pad(d.getMilliseconds(),3)+'00'; },
|
|
54
|
+
Z: function(d){ return offsetStr(d,':'); },
|
|
55
|
+
ZZ: function(d){ return offsetStr(d,''); },
|
|
56
|
+
X: function(d){ return Math.floor(d.getTime()/1000); },
|
|
57
|
+
x: function(d){ return d.getTime(); },
|
|
58
|
+
z: function(d){ return 'UTC'+offsetStr(d,':'); },
|
|
59
|
+
zz: function(d){ return 'UTC'+offsetStr(d,':'); }
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
63
|
+
function pad(n, len) {
|
|
64
|
+
var s = String(Math.abs(n));
|
|
65
|
+
while (s.length < (len||2)) s = '0'+s;
|
|
66
|
+
return (n<0?'-':'')+s;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function offsetStr(d, sep) {
|
|
70
|
+
var off = -d.getTimezoneOffset();
|
|
71
|
+
var sign = off>=0?'+':'-';
|
|
72
|
+
var abs = Math.abs(off);
|
|
73
|
+
return sign + pad(Math.floor(abs/60)) + sep + pad(abs%60);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function dayOfYear(d) {
|
|
77
|
+
var start = new Date(d.getFullYear(),0,0);
|
|
78
|
+
var diff = d - start;
|
|
79
|
+
return Math.floor(diff/86400000);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function weekOfYear(d) {
|
|
83
|
+
var jan1 = new Date(d.getFullYear(),0,1);
|
|
84
|
+
var dayNum = d.getDay()||7;
|
|
85
|
+
return Math.ceil((((d-jan1)/86400000)+jan1.getDay()+1)/7);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function isoWeekOfYear(d) {
|
|
89
|
+
var date = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
|
|
90
|
+
var dayNum = date.getUTCDay()||7;
|
|
91
|
+
date.setUTCDate(date.getUTCDate()+4-dayNum);
|
|
92
|
+
var yearStart = new Date(Date.UTC(date.getUTCFullYear(),0,1));
|
|
93
|
+
return Math.ceil((((date-yearStart)/86400000)+1)/7);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function weekYear(d) {
|
|
97
|
+
var w = weekOfYear(d);
|
|
98
|
+
var year = d.getFullYear();
|
|
99
|
+
if (w===52 && d.getMonth()===0) return year-1;
|
|
100
|
+
if (w===1 && d.getMonth()===11) return year+1;
|
|
101
|
+
return year;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function isoWeekYear(d) {
|
|
105
|
+
var w = isoWeekOfYear(d);
|
|
106
|
+
var year = d.getFullYear();
|
|
107
|
+
if (w===52 && d.getMonth()===0) return year-1;
|
|
108
|
+
if (w===1 && d.getMonth()===11) return year+1;
|
|
109
|
+
return year;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// ─── Parse Input ─────────────────────────────────────────────────────────────
|
|
113
|
+
function parseInput(input, fmt, strict, utcMode, tzOffset) {
|
|
114
|
+
if (input === undefined || input === null) return { d: new Date(), utc: !!utcMode, offset: tzOffset };
|
|
115
|
+
|
|
116
|
+
if (input && input.__isTempox) return { d: new Date(input._d.getTime()), utc: input._utc, offset: input._offset };
|
|
117
|
+
|
|
118
|
+
if (input instanceof Date) return { d: new Date(input.getTime()), utc: !!utcMode, offset: tzOffset };
|
|
119
|
+
|
|
120
|
+
if (typeof input === 'number') return { d: new Date(input), utc: !!utcMode, offset: tzOffset };
|
|
121
|
+
|
|
122
|
+
if (Array.isArray(input)) {
|
|
123
|
+
var a = input;
|
|
124
|
+
var d = utcMode
|
|
125
|
+
? new Date(Date.UTC(a[0]||0,a[1]||0,a[2]!==undefined?a[2]:1,a[3]||0,a[4]||0,a[5]||0,a[6]||0))
|
|
126
|
+
: new Date(a[0]||0,a[1]||0,a[2]!==undefined?a[2]:1,a[3]||0,a[4]||0,a[5]||0,a[6]||0);
|
|
127
|
+
return { d: d, utc: !!utcMode, offset: tzOffset };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (typeof input === 'object' && !(input instanceof Date)) {
|
|
131
|
+
var obj = input;
|
|
132
|
+
var now = new Date();
|
|
133
|
+
var y = obj.year||obj.years||obj.y||now.getFullYear();
|
|
134
|
+
var mo = obj.month!==undefined?obj.month:(obj.months!==undefined?obj.months:(obj.M!==undefined?obj.M:now.getMonth()));
|
|
135
|
+
var day = obj.day||obj.days||obj.date||obj.d||now.getDate();
|
|
136
|
+
var h = obj.hour||obj.hours||obj.h||0;
|
|
137
|
+
var mi = obj.minute||obj.minutes||obj.m||0;
|
|
138
|
+
var s = obj.second||obj.seconds||obj.s||0;
|
|
139
|
+
var ms = obj.millisecond||obj.milliseconds||obj.ms||0;
|
|
140
|
+
return { d: new Date(y, mo, day, h, mi, s, ms), utc: false, offset: tzOffset };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (typeof input === 'string') {
|
|
144
|
+
var aspMatch = input.match(ASP_DATE_REGEX);
|
|
145
|
+
if (aspMatch) return { d: new Date(parseInt(aspMatch[1],10)), utc: !!utcMode, offset: tzOffset };
|
|
146
|
+
|
|
147
|
+
if (fmt) {
|
|
148
|
+
var fmtResult = parseWithFormat(input, fmt, strict, utcMode);
|
|
149
|
+
return fmtResult;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return parseISO(input, utcMode);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return { d: new Date(NaN), utc: !!utcMode, offset: tzOffset };
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function parseISO(str, utcMode) {
|
|
159
|
+
var m = str.trim().match(ISO_REGEX);
|
|
160
|
+
if (!m) return { d: new Date(str), utc: false, offset: undefined };
|
|
161
|
+
|
|
162
|
+
var year = parseInt(m[1],10);
|
|
163
|
+
var month = m[3] ? parseInt(m[3],10)-1 : 0;
|
|
164
|
+
var day = m[5] ? parseInt(m[5],10) : 1;
|
|
165
|
+
var hour = m[7] ? parseInt(m[7],10) : 0;
|
|
166
|
+
var min = m[8] ? parseInt(m[8],10) : 0;
|
|
167
|
+
var sec = m[10]? parseInt(m[10],10) : 0;
|
|
168
|
+
var msRaw = m[12]|| '0';
|
|
169
|
+
while (msRaw.length < 3) msRaw += '0';
|
|
170
|
+
var ms = parseInt(msRaw.slice(0,3),10);
|
|
171
|
+
|
|
172
|
+
var tzStr = m[13];
|
|
173
|
+
var hasTime = !!m[6];
|
|
174
|
+
|
|
175
|
+
if (tzStr) {
|
|
176
|
+
var utcMs = Date.UTC(year,month,day,hour,min,sec,ms);
|
|
177
|
+
if (tzStr !== 'Z') {
|
|
178
|
+
var tzSign = m[14]==='-' ? 1 : -1;
|
|
179
|
+
var tzH = parseInt(m[15],10);
|
|
180
|
+
var tzM = parseInt(m[16],10);
|
|
181
|
+
utcMs += tzSign*(tzH*60+tzM)*60000;
|
|
182
|
+
}
|
|
183
|
+
return { d: new Date(utcMs), utc: true, offset: undefined };
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (!hasTime && !utcMode) {
|
|
187
|
+
// date-only -> local midnight (moment behaviour)
|
|
188
|
+
return { d: new Date(year,month,day,0,0,0,0), utc: false, offset: undefined };
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (utcMode) {
|
|
192
|
+
return { d: new Date(Date.UTC(year,month,day,hour,min,sec,ms)), utc: true, offset: undefined };
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return { d: new Date(year,month,day,hour,min,sec,ms), utc: false, offset: undefined };
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// ─── Format-guided parsing ────────────────────────────────────────────────────
|
|
199
|
+
var PARSE_TOKENS = {
|
|
200
|
+
YYYY: { rx: '(\\d{4})', set: function(p,v){ p.year = parseInt(v,10); } },
|
|
201
|
+
YY: { rx: '(\\d{2})', set: function(p,v){ var n=parseInt(v,10); p.year = n<69?2000+n:1900+n; } },
|
|
202
|
+
M: { rx: '(\\d{1,2})', set: function(p,v){ p.month = parseInt(v,10)-1; } },
|
|
203
|
+
MM: { rx: '(\\d{2})', set: function(p,v){ p.month = parseInt(v,10)-1; } },
|
|
204
|
+
D: { rx: '(\\d{1,2})', set: function(p,v){ p.day = parseInt(v,10); } },
|
|
205
|
+
DD: { rx: '(\\d{2})', set: function(p,v){ p.day = parseInt(v,10); } },
|
|
206
|
+
H: { rx: '(\\d{1,2})', set: function(p,v){ p.hour = parseInt(v,10); } },
|
|
207
|
+
HH: { rx: '(\\d{2})', set: function(p,v){ p.hour = parseInt(v,10); } },
|
|
208
|
+
h: { rx: '(\\d{1,2})', set: function(p,v){ p.hour12 = parseInt(v,10); } },
|
|
209
|
+
hh: { rx: '(\\d{2})', set: function(p,v){ p.hour12 = parseInt(v,10); } },
|
|
210
|
+
m: { rx: '(\\d{1,2})', set: function(p,v){ p.minute = parseInt(v,10); } },
|
|
211
|
+
mm: { rx: '(\\d{2})', set: function(p,v){ p.minute = parseInt(v,10); } },
|
|
212
|
+
s: { rx: '(\\d{1,2})', set: function(p,v){ p.second = parseInt(v,10); } },
|
|
213
|
+
ss: { rx: '(\\d{2})', set: function(p,v){ p.second = parseInt(v,10); } },
|
|
214
|
+
S: { rx: '(\\d)', set: function(p,v){ p.ms = parseInt(v,10)*100; } },
|
|
215
|
+
SS: { rx: '(\\d{2})', set: function(p,v){ p.ms = parseInt(v,10)*10; } },
|
|
216
|
+
SSS: { rx: '(\\d{3})', set: function(p,v){ p.ms = parseInt(v,10); } },
|
|
217
|
+
A: { rx: '(AM|PM)', set: function(p,v){ p.ampm = v; } },
|
|
218
|
+
a: { rx: '(am|pm)', set: function(p,v){ p.ampm = v.toUpperCase(); } },
|
|
219
|
+
X: { rx: '(-?\\d+)', set: function(p,v){ p.unix = parseInt(v,10); } },
|
|
220
|
+
x: { rx: '(-?\\d+)', set: function(p,v){ p.unixMs = parseInt(v,10); } },
|
|
221
|
+
Z: { rx: '([+-]\\d{2}:\\d{2}|Z)', set: function(p,v){ p.tz = v; } },
|
|
222
|
+
ZZ: { rx: '([+-]\\d{4}|Z)', set: function(p,v){ p.tz = v; } }
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
function parseWithFormat(str, fmts, strict, utcMode) {
|
|
226
|
+
var formatList = Array.isArray(fmts) ? fmts : [fmts];
|
|
227
|
+
for (var fi = 0; fi < formatList.length; fi++) {
|
|
228
|
+
var result = tryParseFormat(str, formatList[fi], strict, utcMode);
|
|
229
|
+
if (result.valid) return { d: result.d, utc: !!utcMode, offset: undefined };
|
|
230
|
+
}
|
|
231
|
+
return { d: new Date(NaN), utc: !!utcMode, offset: undefined };
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function tryParseFormat(str, fmt, strict, utcMode) {
|
|
235
|
+
var tokens = [];
|
|
236
|
+
var setters = [];
|
|
237
|
+
|
|
238
|
+
// Step 1: replace tokens with placeholders, escape literal separators
|
|
239
|
+
var parts = [];
|
|
240
|
+
var remaining = fmt;
|
|
241
|
+
var tokenRx = /YYYY|YY|MM|M|DD|D|HH|H|hh|h|mm|m|ss|s|SSS|SS|S|A|a|ZZ|Z|X|x|\[([^\]]*)\]/g;
|
|
242
|
+
var lastIdx = 0;
|
|
243
|
+
var m2;
|
|
244
|
+
var regexParts = [];
|
|
245
|
+
|
|
246
|
+
tokenRx.lastIndex = 0;
|
|
247
|
+
while ((m2 = tokenRx.exec(fmt)) !== null) {
|
|
248
|
+
// Escape literal text between tokens
|
|
249
|
+
var literal = fmt.slice(lastIdx, m2.index);
|
|
250
|
+
if (literal) regexParts.push(literal.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'));
|
|
251
|
+
|
|
252
|
+
var tok = m2[0];
|
|
253
|
+
if (tok[0] === '[') {
|
|
254
|
+
// literal inside brackets
|
|
255
|
+
regexParts.push((m2[1]||'').replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'));
|
|
256
|
+
} else {
|
|
257
|
+
var def = PARSE_TOKENS[tok];
|
|
258
|
+
if (def) {
|
|
259
|
+
tokens.push(tok);
|
|
260
|
+
setters.push(def.set);
|
|
261
|
+
regexParts.push(def.rx);
|
|
262
|
+
} else {
|
|
263
|
+
regexParts.push(tok.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
lastIdx = tokenRx.lastIndex;
|
|
267
|
+
}
|
|
268
|
+
// Remaining literal after last token
|
|
269
|
+
var tail = fmt.slice(lastIdx);
|
|
270
|
+
if (tail) regexParts.push(tail.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'));
|
|
271
|
+
|
|
272
|
+
var pattern = regexParts.join('');
|
|
273
|
+
var regex = new RegExp(strict ? '^'+pattern+'$' : pattern, 'i');
|
|
274
|
+
var match = str.match(regex);
|
|
275
|
+
if (!match) return { valid: false };
|
|
276
|
+
|
|
277
|
+
var parts = { year: undefined, month: undefined, day: undefined, hour: undefined,
|
|
278
|
+
hour12: undefined, minute: undefined, second: undefined, ms: undefined,
|
|
279
|
+
ampm: undefined, tz: undefined, unix: undefined, unixMs: undefined };
|
|
280
|
+
|
|
281
|
+
for (var i = 0; i < setters.length; i++) {
|
|
282
|
+
setters[i](parts, match[i+1]);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (parts.unixMs !== undefined) return { valid: true, d: new Date(parts.unixMs) };
|
|
286
|
+
if (parts.unix !== undefined) return { valid: true, d: new Date(parts.unix*1000) };
|
|
287
|
+
|
|
288
|
+
var now = new Date();
|
|
289
|
+
var year = parts.year !== undefined ? parts.year : now.getFullYear();
|
|
290
|
+
var month = parts.month !== undefined ? parts.month : 0;
|
|
291
|
+
var day = parts.day !== undefined ? parts.day : 1;
|
|
292
|
+
var hour = parts.hour !== undefined ? parts.hour : (parts.hour12 !== undefined ? parts.hour12 : 0);
|
|
293
|
+
var minute = parts.minute !== undefined ? parts.minute : 0;
|
|
294
|
+
var second = parts.second !== undefined ? parts.second : 0;
|
|
295
|
+
var ms = parts.ms !== undefined ? parts.ms : 0;
|
|
296
|
+
|
|
297
|
+
if (parts.ampm && parts.hour12 !== undefined) {
|
|
298
|
+
if (parts.ampm === 'PM' && hour < 12) hour += 12;
|
|
299
|
+
if (parts.ampm === 'AM' && hour === 12) hour = 0;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
var d;
|
|
303
|
+
if (parts.tz) {
|
|
304
|
+
var tzStr = parts.tz;
|
|
305
|
+
if (tzStr === 'Z') {
|
|
306
|
+
d = new Date(Date.UTC(year,month,day,hour,minute,second,ms));
|
|
307
|
+
} else {
|
|
308
|
+
var clean = tzStr.replace(':','');
|
|
309
|
+
var sign = clean[0]==='-' ? 1 : -1;
|
|
310
|
+
var tzH = parseInt(clean.slice(1,3),10);
|
|
311
|
+
var tzM = parseInt(clean.slice(3,5),10);
|
|
312
|
+
var utcMs2 = Date.UTC(year,month,day,hour,minute,second,ms);
|
|
313
|
+
d = new Date(utcMs2 + sign*(tzH*60+tzM)*60000);
|
|
314
|
+
}
|
|
315
|
+
} else if (utcMode) {
|
|
316
|
+
d = new Date(Date.UTC(year,month,day,hour,minute,second,ms));
|
|
317
|
+
} else {
|
|
318
|
+
d = new Date(year,month,day,hour,minute,second,ms);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return { valid: !isNaN(d.getTime()), d: d };
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
module.exports = {
|
|
325
|
+
parseInput: parseInput,
|
|
326
|
+
FORMAT_TOKENS: FORMAT_TOKENS,
|
|
327
|
+
TOKEN_REGEX: TOKEN_REGEX,
|
|
328
|
+
pad: pad,
|
|
329
|
+
dayOfYear: dayOfYear,
|
|
330
|
+
weekOfYear: weekOfYear,
|
|
331
|
+
isoWeekOfYear: isoWeekOfYear,
|
|
332
|
+
weekYear: weekYear,
|
|
333
|
+
isoWeekYear: isoWeekYear,
|
|
334
|
+
offsetStr: offsetStr
|
|
335
|
+
};
|