|
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' : '')); |
|
} |
|
); |
|
|