| | import { configFromStringAndFormat } from './from-string-and-format'; |
| | import { createUTCDate } from './date-from-array'; |
| | import { configFromArray } from './from-array'; |
| | import { hooks } from '../utils/hooks'; |
| | import { deprecate } from '../utils/deprecate'; |
| | import getParsingFlags from './parsing-flags'; |
| | import {defaultLocaleMonthsShort} from '../units/month'; |
| | import {defaultLocaleWeekdaysShort} from '../units/day-of-week'; |
| |
|
| | |
| | |
| | var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; |
| | var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; |
| |
|
| | var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; |
| |
|
| | var isoDates = [ |
| | ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], |
| | ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], |
| | ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], |
| | ['GGGG-[W]WW', /\d{4}-W\d\d/, false], |
| | ['YYYY-DDD', /\d{4}-\d{3}/], |
| | ['YYYY-MM', /\d{4}-\d\d/, false], |
| | ['YYYYYYMMDD', /[+-]\d{10}/], |
| | ['YYYYMMDD', /\d{8}/], |
| | |
| | ['GGGG[W]WWE', /\d{4}W\d{3}/], |
| | ['GGGG[W]WW', /\d{4}W\d{2}/, false], |
| | ['YYYYDDD', /\d{7}/] |
| | ]; |
| |
|
| | |
| | var isoTimes = [ |
| | ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], |
| | ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], |
| | ['HH:mm:ss', /\d\d:\d\d:\d\d/], |
| | ['HH:mm', /\d\d:\d\d/], |
| | ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], |
| | ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], |
| | ['HHmmss', /\d\d\d\d\d\d/], |
| | ['HHmm', /\d\d\d\d/], |
| | ['HH', /\d\d/] |
| | ]; |
| |
|
| | var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; |
| |
|
| | |
| | export function configFromISO(config) { |
| | var i, l, |
| | string = config._i, |
| | match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), |
| | allowTime, dateFormat, timeFormat, tzFormat; |
| |
|
| | if (match) { |
| | getParsingFlags(config).iso = true; |
| |
|
| | for (i = 0, l = isoDates.length; i < l; i++) { |
| | if (isoDates[i][1].exec(match[1])) { |
| | dateFormat = isoDates[i][0]; |
| | allowTime = isoDates[i][2] !== false; |
| | break; |
| | } |
| | } |
| | if (dateFormat == null) { |
| | config._isValid = false; |
| | return; |
| | } |
| | if (match[3]) { |
| | for (i = 0, l = isoTimes.length; i < l; i++) { |
| | if (isoTimes[i][1].exec(match[3])) { |
| | |
| | timeFormat = (match[2] || ' ') + isoTimes[i][0]; |
| | break; |
| | } |
| | } |
| | if (timeFormat == null) { |
| | config._isValid = false; |
| | return; |
| | } |
| | } |
| | if (!allowTime && timeFormat != null) { |
| | config._isValid = false; |
| | return; |
| | } |
| | if (match[4]) { |
| | if (tzRegex.exec(match[4])) { |
| | tzFormat = 'Z'; |
| | } else { |
| | config._isValid = false; |
| | return; |
| | } |
| | } |
| | config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); |
| | configFromStringAndFormat(config); |
| | } else { |
| | config._isValid = false; |
| | } |
| | } |
| |
|
| | |
| | var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; |
| |
|
| | function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { |
| | var result = [ |
| | untruncateYear(yearStr), |
| | defaultLocaleMonthsShort.indexOf(monthStr), |
| | parseInt(dayStr, 10), |
| | parseInt(hourStr, 10), |
| | parseInt(minuteStr, 10) |
| | ]; |
| |
|
| | if (secondStr) { |
| | result.push(parseInt(secondStr, 10)); |
| | } |
| |
|
| | return result; |
| | } |
| |
|
| | function untruncateYear(yearStr) { |
| | var year = parseInt(yearStr, 10); |
| | if (year <= 49) { |
| | return 2000 + year; |
| | } else if (year <= 999) { |
| | return 1900 + year; |
| | } |
| | return year; |
| | } |
| |
|
| | function preprocessRFC2822(s) { |
| | |
| | return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, ''); |
| | } |
| |
|
| | function checkWeekday(weekdayStr, parsedInput, config) { |
| | if (weekdayStr) { |
| | |
| | var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), |
| | weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); |
| | if (weekdayProvided !== weekdayActual) { |
| | getParsingFlags(config).weekdayMismatch = true; |
| | config._isValid = false; |
| | return false; |
| | } |
| | } |
| | return true; |
| | } |
| |
|
| | var obsOffsets = { |
| | UT: 0, |
| | GMT: 0, |
| | EDT: -4 * 60, |
| | EST: -5 * 60, |
| | CDT: -5 * 60, |
| | CST: -6 * 60, |
| | MDT: -6 * 60, |
| | MST: -7 * 60, |
| | PDT: -7 * 60, |
| | PST: -8 * 60 |
| | }; |
| |
|
| | function calculateOffset(obsOffset, militaryOffset, numOffset) { |
| | if (obsOffset) { |
| | return obsOffsets[obsOffset]; |
| | } else if (militaryOffset) { |
| | |
| | return 0; |
| | } else { |
| | var hm = parseInt(numOffset, 10); |
| | var m = hm % 100, h = (hm - m) / 100; |
| | return h * 60 + m; |
| | } |
| | } |
| |
|
| | |
| | export function configFromRFC2822(config) { |
| | var match = rfc2822.exec(preprocessRFC2822(config._i)); |
| | if (match) { |
| | var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); |
| | if (!checkWeekday(match[1], parsedArray, config)) { |
| | return; |
| | } |
| |
|
| | config._a = parsedArray; |
| | config._tzm = calculateOffset(match[8], match[9], match[10]); |
| |
|
| | config._d = createUTCDate.apply(null, config._a); |
| | config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); |
| |
|
| | getParsingFlags(config).rfc2822 = true; |
| | } else { |
| | config._isValid = false; |
| | } |
| | } |
| |
|
| | |
| | export function configFromString(config) { |
| | var matched = aspNetJsonRegex.exec(config._i); |
| |
|
| | if (matched !== null) { |
| | config._d = new Date(+matched[1]); |
| | return; |
| | } |
| |
|
| | configFromISO(config); |
| | if (config._isValid === false) { |
| | delete config._isValid; |
| | } else { |
| | return; |
| | } |
| |
|
| | configFromRFC2822(config); |
| | if (config._isValid === false) { |
| | delete config._isValid; |
| | } else { |
| | return; |
| | } |
| |
|
| | |
| | hooks.createFromInputFallback(config); |
| | } |
| |
|
| | hooks.createFromInputFallback = deprecate( |
| | 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + |
| | 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + |
| | 'discouraged and will be removed in an upcoming major release. Please refer to ' + |
| | 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', |
| | function (config) { |
| | config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); |
| | } |
| | ); |
| |
|