1 define(['../array/some'], function (some) {
4 /^([0-9]{4})$/, // YYYY
5 /^([0-9]{4})-([0-9]{2})$/, // YYYY-MM (YYYYMM not allowed)
6 /^([0-9]{4})-?([0-9]{2})-?([0-9]{2})$/ // YYYY-MM-DD or YYYYMMDD
8 var ORD_DATE = /^([0-9]{4})-?([0-9]{3})$/; // YYYY-DDD
11 /^([0-9]{2}(?:\.[0-9]*)?)$/, // HH.hh
12 /^([0-9]{2}):?([0-9]{2}(?:\.[0-9]*)?)$/, // HH:MM.mm
13 /^([0-9]{2}):?([0-9]{2}):?([0-9]{2}(\.[0-9]*)?)$/ // HH:MM:SS.ss
16 var DATE_TIME = /^(.+)T(.+)$/;
17 var TIME_ZONE = /^(.+)([+\-])([0-9]{2}):?([0-9]{2})$/;
19 function matchAll(str, patterns) {
21 var found = some(patterns, function(pattern) {
22 return !!(match = pattern.exec(str));
25 return found ? match : null;
28 function getDate(year, month, day) {
29 var date = new Date(Date.UTC(year, month, day));
31 // Explicitly set year to avoid Date.UTC making dates < 100 relative to
33 date.setUTCFullYear(year);
36 date.getUTCFullYear() === year &&
37 date.getUTCMonth() === month &&
38 date.getUTCDate() === day;
39 return valid ? +date : NaN;
42 function parseOrdinalDate(str) {
43 var match = ORD_DATE.exec(str);
47 date = new Date(Date.UTC(year, 0, day));
49 if (date.getUTCFullYear() === year) {
57 function parseDate(str) {
58 var match, year, month, day;
60 match = matchAll(str, datePatterns);
62 // Ordinal dates are verified differently.
63 return parseOrdinalDate(str);
66 year = (match[1] === void 0) ? 0 : +match[1];
67 month = (match[2] === void 0) ? 0 : +match[2] - 1;
68 day = (match[3] === void 0) ? 1 : +match[3];
70 return getDate(year, month, day);
73 function getTime(hr, min, sec) {
75 (hr < 24 && hr >= 0 &&
76 min < 60 && min >= 0 &&
77 sec < 60 && min >= 0) ||
78 (hr === 24 && min === 0 && sec === 0);
83 return ((hr * 60 + min) * 60 + sec) * 1000;
86 function parseOffset(str) {
88 if (str.charAt(str.length - 1) === 'Z') {
89 str = str.substring(0, str.length - 1);
91 match = TIME_ZONE.exec(str);
93 var hours = +match[3],
94 minutes = (match[4] === void 0) ? 0 : +match[4],
95 offset = getTime(hours, minutes, 0);
97 if (match[2] === '-') {
101 return { offset: offset, time: match[1] };
105 // No time zone specified, assume UTC
106 return { offset: 0, time: str };
109 function parseTime(str) {
111 var offset = parseOffset(str);
114 offset = offset.offset;
119 match = matchAll(str, timePatterns);
120 if (match === null) {
124 var hours = (match[1] === void 0) ? 0 : +match[1],
125 minutes = (match[2] === void 0) ? 0 : +match[2],
126 seconds = (match[3] === void 0) ? 0 : +match[3];
128 return getTime(hours, minutes, seconds) - offset;
132 * Parse an ISO8601 formatted date string, and return a Date object.
134 function parseISO8601(str){
135 var match = DATE_TIME.exec(str);
138 return parseDate(str);
141 return parseDate(match[1]) + parseTime(match[2]);