[ Index ] |
PHP Cross Reference of WordPress |
[Summary view] [Print] [Text view]
1 //! moment.js 2 //! version : 2.29.2 3 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors 4 //! license : MIT 5 //! momentjs.com 6 7 ;(function (global, factory) { 8 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 9 typeof define === 'function' && define.amd ? define(factory) : 10 global.moment = factory() 11 }(this, (function () { 'use strict'; 12 13 var hookCallback; 14 15 function hooks() { 16 return hookCallback.apply(null, arguments); 17 } 18 19 // This is done to register the method called with moment() 20 // without creating circular dependencies. 21 function setHookCallback(callback) { 22 hookCallback = callback; 23 } 24 25 function isArray(input) { 26 return ( 27 input instanceof Array || 28 Object.prototype.toString.call(input) === '[object Array]' 29 ); 30 } 31 32 function isObject(input) { 33 // IE8 will treat undefined and null as object if it wasn't for 34 // input != null 35 return ( 36 input != null && 37 Object.prototype.toString.call(input) === '[object Object]' 38 ); 39 } 40 41 function hasOwnProp(a, b) { 42 return Object.prototype.hasOwnProperty.call(a, b); 43 } 44 45 function isObjectEmpty(obj) { 46 if (Object.getOwnPropertyNames) { 47 return Object.getOwnPropertyNames(obj).length === 0; 48 } else { 49 var k; 50 for (k in obj) { 51 if (hasOwnProp(obj, k)) { 52 return false; 53 } 54 } 55 return true; 56 } 57 } 58 59 function isUndefined(input) { 60 return input === void 0; 61 } 62 63 function isNumber(input) { 64 return ( 65 typeof input === 'number' || 66 Object.prototype.toString.call(input) === '[object Number]' 67 ); 68 } 69 70 function isDate(input) { 71 return ( 72 input instanceof Date || 73 Object.prototype.toString.call(input) === '[object Date]' 74 ); 75 } 76 77 function map(arr, fn) { 78 var res = [], 79 i, 80 arrLen = arr.length; 81 for (i = 0; i < arrLen; ++i) { 82 res.push(fn(arr[i], i)); 83 } 84 return res; 85 } 86 87 function extend(a, b) { 88 for (var i in b) { 89 if (hasOwnProp(b, i)) { 90 a[i] = b[i]; 91 } 92 } 93 94 if (hasOwnProp(b, 'toString')) { 95 a.toString = b.toString; 96 } 97 98 if (hasOwnProp(b, 'valueOf')) { 99 a.valueOf = b.valueOf; 100 } 101 102 return a; 103 } 104 105 function createUTC(input, format, locale, strict) { 106 return createLocalOrUTC(input, format, locale, strict, true).utc(); 107 } 108 109 function defaultParsingFlags() { 110 // We need to deep clone this object. 111 return { 112 empty: false, 113 unusedTokens: [], 114 unusedInput: [], 115 overflow: -2, 116 charsLeftOver: 0, 117 nullInput: false, 118 invalidEra: null, 119 invalidMonth: null, 120 invalidFormat: false, 121 userInvalidated: false, 122 iso: false, 123 parsedDateParts: [], 124 era: null, 125 meridiem: null, 126 rfc2822: false, 127 weekdayMismatch: false, 128 }; 129 } 130 131 function getParsingFlags(m) { 132 if (m._pf == null) { 133 m._pf = defaultParsingFlags(); 134 } 135 return m._pf; 136 } 137 138 var some; 139 if (Array.prototype.some) { 140 some = Array.prototype.some; 141 } else { 142 some = function (fun) { 143 var t = Object(this), 144 len = t.length >>> 0, 145 i; 146 147 for (i = 0; i < len; i++) { 148 if (i in t && fun.call(this, t[i], i, t)) { 149 return true; 150 } 151 } 152 153 return false; 154 }; 155 } 156 157 function isValid(m) { 158 if (m._isValid == null) { 159 var flags = getParsingFlags(m), 160 parsedParts = some.call(flags.parsedDateParts, function (i) { 161 return i != null; 162 }), 163 isNowValid = 164 !isNaN(m._d.getTime()) && 165 flags.overflow < 0 && 166 !flags.empty && 167 !flags.invalidEra && 168 !flags.invalidMonth && 169 !flags.invalidWeekday && 170 !flags.weekdayMismatch && 171 !flags.nullInput && 172 !flags.invalidFormat && 173 !flags.userInvalidated && 174 (!flags.meridiem || (flags.meridiem && parsedParts)); 175 176 if (m._strict) { 177 isNowValid = 178 isNowValid && 179 flags.charsLeftOver === 0 && 180 flags.unusedTokens.length === 0 && 181 flags.bigHour === undefined; 182 } 183 184 if (Object.isFrozen == null || !Object.isFrozen(m)) { 185 m._isValid = isNowValid; 186 } else { 187 return isNowValid; 188 } 189 } 190 return m._isValid; 191 } 192 193 function createInvalid(flags) { 194 var m = createUTC(NaN); 195 if (flags != null) { 196 extend(getParsingFlags(m), flags); 197 } else { 198 getParsingFlags(m).userInvalidated = true; 199 } 200 201 return m; 202 } 203 204 // Plugins that add properties should also add the key here (null value), 205 // so we can properly clone ourselves. 206 var momentProperties = (hooks.momentProperties = []), 207 updateInProgress = false; 208 209 function copyConfig(to, from) { 210 var i, 211 prop, 212 val, 213 momentPropertiesLen = momentProperties.length; 214 215 if (!isUndefined(from._isAMomentObject)) { 216 to._isAMomentObject = from._isAMomentObject; 217 } 218 if (!isUndefined(from._i)) { 219 to._i = from._i; 220 } 221 if (!isUndefined(from._f)) { 222 to._f = from._f; 223 } 224 if (!isUndefined(from._l)) { 225 to._l = from._l; 226 } 227 if (!isUndefined(from._strict)) { 228 to._strict = from._strict; 229 } 230 if (!isUndefined(from._tzm)) { 231 to._tzm = from._tzm; 232 } 233 if (!isUndefined(from._isUTC)) { 234 to._isUTC = from._isUTC; 235 } 236 if (!isUndefined(from._offset)) { 237 to._offset = from._offset; 238 } 239 if (!isUndefined(from._pf)) { 240 to._pf = getParsingFlags(from); 241 } 242 if (!isUndefined(from._locale)) { 243 to._locale = from._locale; 244 } 245 246 if (momentPropertiesLen > 0) { 247 for (i = 0; i < momentPropertiesLen; i++) { 248 prop = momentProperties[i]; 249 val = from[prop]; 250 if (!isUndefined(val)) { 251 to[prop] = val; 252 } 253 } 254 } 255 256 return to; 257 } 258 259 // Moment prototype object 260 function Moment(config) { 261 copyConfig(this, config); 262 this._d = new Date(config._d != null ? config._d.getTime() : NaN); 263 if (!this.isValid()) { 264 this._d = new Date(NaN); 265 } 266 // Prevent infinite loop in case updateOffset creates new moment 267 // objects. 268 if (updateInProgress === false) { 269 updateInProgress = true; 270 hooks.updateOffset(this); 271 updateInProgress = false; 272 } 273 } 274 275 function isMoment(obj) { 276 return ( 277 obj instanceof Moment || (obj != null && obj._isAMomentObject != null) 278 ); 279 } 280 281 function warn(msg) { 282 if ( 283 hooks.suppressDeprecationWarnings === false && 284 typeof console !== 'undefined' && 285 console.warn 286 ) { 287 console.warn('Deprecation warning: ' + msg); 288 } 289 } 290 291 function deprecate(msg, fn) { 292 var firstTime = true; 293 294 return extend(function () { 295 if (hooks.deprecationHandler != null) { 296 hooks.deprecationHandler(null, msg); 297 } 298 if (firstTime) { 299 var args = [], 300 arg, 301 i, 302 key, 303 argLen = arguments.length; 304 for (i = 0; i < argLen; i++) { 305 arg = ''; 306 if (typeof arguments[i] === 'object') { 307 arg += '\n[' + i + '] '; 308 for (key in arguments[0]) { 309 if (hasOwnProp(arguments[0], key)) { 310 arg += key + ': ' + arguments[0][key] + ', '; 311 } 312 } 313 arg = arg.slice(0, -2); // Remove trailing comma and space 314 } else { 315 arg = arguments[i]; 316 } 317 args.push(arg); 318 } 319 warn( 320 msg + 321 '\nArguments: ' + 322 Array.prototype.slice.call(args).join('') + 323 '\n' + 324 new Error().stack 325 ); 326 firstTime = false; 327 } 328 return fn.apply(this, arguments); 329 }, fn); 330 } 331 332 var deprecations = {}; 333 334 function deprecateSimple(name, msg) { 335 if (hooks.deprecationHandler != null) { 336 hooks.deprecationHandler(name, msg); 337 } 338 if (!deprecations[name]) { 339 warn(msg); 340 deprecations[name] = true; 341 } 342 } 343 344 hooks.suppressDeprecationWarnings = false; 345 hooks.deprecationHandler = null; 346 347 function isFunction(input) { 348 return ( 349 (typeof Function !== 'undefined' && input instanceof Function) || 350 Object.prototype.toString.call(input) === '[object Function]' 351 ); 352 } 353 354 function set(config) { 355 var prop, i; 356 for (i in config) { 357 if (hasOwnProp(config, i)) { 358 prop = config[i]; 359 if (isFunction(prop)) { 360 this[i] = prop; 361 } else { 362 this['_' + i] = prop; 363 } 364 } 365 } 366 this._config = config; 367 // Lenient ordinal parsing accepts just a number in addition to 368 // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. 369 // TODO: Remove "ordinalParse" fallback in next major release. 370 this._dayOfMonthOrdinalParseLenient = new RegExp( 371 (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + 372 '|' + 373 /\d{1,2}/.source 374 ); 375 } 376 377 function mergeConfigs(parentConfig, childConfig) { 378 var res = extend({}, parentConfig), 379 prop; 380 for (prop in childConfig) { 381 if (hasOwnProp(childConfig, prop)) { 382 if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { 383 res[prop] = {}; 384 extend(res[prop], parentConfig[prop]); 385 extend(res[prop], childConfig[prop]); 386 } else if (childConfig[prop] != null) { 387 res[prop] = childConfig[prop]; 388 } else { 389 delete res[prop]; 390 } 391 } 392 } 393 for (prop in parentConfig) { 394 if ( 395 hasOwnProp(parentConfig, prop) && 396 !hasOwnProp(childConfig, prop) && 397 isObject(parentConfig[prop]) 398 ) { 399 // make sure changes to properties don't modify parent config 400 res[prop] = extend({}, res[prop]); 401 } 402 } 403 return res; 404 } 405 406 function Locale(config) { 407 if (config != null) { 408 this.set(config); 409 } 410 } 411 412 var keys; 413 414 if (Object.keys) { 415 keys = Object.keys; 416 } else { 417 keys = function (obj) { 418 var i, 419 res = []; 420 for (i in obj) { 421 if (hasOwnProp(obj, i)) { 422 res.push(i); 423 } 424 } 425 return res; 426 }; 427 } 428 429 var defaultCalendar = { 430 sameDay: '[Today at] LT', 431 nextDay: '[Tomorrow at] LT', 432 nextWeek: 'dddd [at] LT', 433 lastDay: '[Yesterday at] LT', 434 lastWeek: '[Last] dddd [at] LT', 435 sameElse: 'L', 436 }; 437 438 function calendar(key, mom, now) { 439 var output = this._calendar[key] || this._calendar['sameElse']; 440 return isFunction(output) ? output.call(mom, now) : output; 441 } 442 443 function zeroFill(number, targetLength, forceSign) { 444 var absNumber = '' + Math.abs(number), 445 zerosToFill = targetLength - absNumber.length, 446 sign = number >= 0; 447 return ( 448 (sign ? (forceSign ? '+' : '') : '-') + 449 Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + 450 absNumber 451 ); 452 } 453 454 var formattingTokens = 455 /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, 456 localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, 457 formatFunctions = {}, 458 formatTokenFunctions = {}; 459 460 // token: 'M' 461 // padded: ['MM', 2] 462 // ordinal: 'Mo' 463 // callback: function () { this.month() + 1 } 464 function addFormatToken(token, padded, ordinal, callback) { 465 var func = callback; 466 if (typeof callback === 'string') { 467 func = function () { 468 return this[callback](); 469 }; 470 } 471 if (token) { 472 formatTokenFunctions[token] = func; 473 } 474 if (padded) { 475 formatTokenFunctions[padded[0]] = function () { 476 return zeroFill(func.apply(this, arguments), padded[1], padded[2]); 477 }; 478 } 479 if (ordinal) { 480 formatTokenFunctions[ordinal] = function () { 481 return this.localeData().ordinal( 482 func.apply(this, arguments), 483 token 484 ); 485 }; 486 } 487 } 488 489 function removeFormattingTokens(input) { 490 if (input.match(/\[[\s\S]/)) { 491 return input.replace(/^\[|\]$/g, ''); 492 } 493 return input.replace(/\\/g, ''); 494 } 495 496 function makeFormatFunction(format) { 497 var array = format.match(formattingTokens), 498 i, 499 length; 500 501 for (i = 0, length = array.length; i < length; i++) { 502 if (formatTokenFunctions[array[i]]) { 503 array[i] = formatTokenFunctions[array[i]]; 504 } else { 505 array[i] = removeFormattingTokens(array[i]); 506 } 507 } 508 509 return function (mom) { 510 var output = '', 511 i; 512 for (i = 0; i < length; i++) { 513 output += isFunction(array[i]) 514 ? array[i].call(mom, format) 515 : array[i]; 516 } 517 return output; 518 }; 519 } 520 521 // format date using native date object 522 function formatMoment(m, format) { 523 if (!m.isValid()) { 524 return m.localeData().invalidDate(); 525 } 526 527 format = expandFormat(format, m.localeData()); 528 formatFunctions[format] = 529 formatFunctions[format] || makeFormatFunction(format); 530 531 return formatFunctions[format](m); 532 } 533 534 function expandFormat(format, locale) { 535 var i = 5; 536 537 function replaceLongDateFormatTokens(input) { 538 return locale.longDateFormat(input) || input; 539 } 540 541 localFormattingTokens.lastIndex = 0; 542 while (i >= 0 && localFormattingTokens.test(format)) { 543 format = format.replace( 544 localFormattingTokens, 545 replaceLongDateFormatTokens 546 ); 547 localFormattingTokens.lastIndex = 0; 548 i -= 1; 549 } 550 551 return format; 552 } 553 554 var defaultLongDateFormat = { 555 LTS: 'h:mm:ss A', 556 LT: 'h:mm A', 557 L: 'MM/DD/YYYY', 558 LL: 'MMMM D, YYYY', 559 LLL: 'MMMM D, YYYY h:mm A', 560 LLLL: 'dddd, MMMM D, YYYY h:mm A', 561 }; 562 563 function longDateFormat(key) { 564 var format = this._longDateFormat[key], 565 formatUpper = this._longDateFormat[key.toUpperCase()]; 566 567 if (format || !formatUpper) { 568 return format; 569 } 570 571 this._longDateFormat[key] = formatUpper 572 .match(formattingTokens) 573 .map(function (tok) { 574 if ( 575 tok === 'MMMM' || 576 tok === 'MM' || 577 tok === 'DD' || 578 tok === 'dddd' 579 ) { 580 return tok.slice(1); 581 } 582 return tok; 583 }) 584 .join(''); 585 586 return this._longDateFormat[key]; 587 } 588 589 var defaultInvalidDate = 'Invalid date'; 590 591 function invalidDate() { 592 return this._invalidDate; 593 } 594 595 var defaultOrdinal = '%d', 596 defaultDayOfMonthOrdinalParse = /\d{1,2}/; 597 598 function ordinal(number) { 599 return this._ordinal.replace('%d', number); 600 } 601 602 var defaultRelativeTime = { 603 future: 'in %s', 604 past: '%s ago', 605 s: 'a few seconds', 606 ss: '%d seconds', 607 m: 'a minute', 608 mm: '%d minutes', 609 h: 'an hour', 610 hh: '%d hours', 611 d: 'a day', 612 dd: '%d days', 613 w: 'a week', 614 ww: '%d weeks', 615 M: 'a month', 616 MM: '%d months', 617 y: 'a year', 618 yy: '%d years', 619 }; 620 621 function relativeTime(number, withoutSuffix, string, isFuture) { 622 var output = this._relativeTime[string]; 623 return isFunction(output) 624 ? output(number, withoutSuffix, string, isFuture) 625 : output.replace(/%d/i, number); 626 } 627 628 function pastFuture(diff, output) { 629 var format = this._relativeTime[diff > 0 ? 'future' : 'past']; 630 return isFunction(format) ? format(output) : format.replace(/%s/i, output); 631 } 632 633 var aliases = {}; 634 635 function addUnitAlias(unit, shorthand) { 636 var lowerCase = unit.toLowerCase(); 637 aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; 638 } 639 640 function normalizeUnits(units) { 641 return typeof units === 'string' 642 ? aliases[units] || aliases[units.toLowerCase()] 643 : undefined; 644 } 645 646 function normalizeObjectUnits(inputObject) { 647 var normalizedInput = {}, 648 normalizedProp, 649 prop; 650 651 for (prop in inputObject) { 652 if (hasOwnProp(inputObject, prop)) { 653 normalizedProp = normalizeUnits(prop); 654 if (normalizedProp) { 655 normalizedInput[normalizedProp] = inputObject[prop]; 656 } 657 } 658 } 659 660 return normalizedInput; 661 } 662 663 var priorities = {}; 664 665 function addUnitPriority(unit, priority) { 666 priorities[unit] = priority; 667 } 668 669 function getPrioritizedUnits(unitsObj) { 670 var units = [], 671 u; 672 for (u in unitsObj) { 673 if (hasOwnProp(unitsObj, u)) { 674 units.push({ unit: u, priority: priorities[u] }); 675 } 676 } 677 units.sort(function (a, b) { 678 return a.priority - b.priority; 679 }); 680 return units; 681 } 682 683 function isLeapYear(year) { 684 return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; 685 } 686 687 function absFloor(number) { 688 if (number < 0) { 689 // -0 -> 0 690 return Math.ceil(number) || 0; 691 } else { 692 return Math.floor(number); 693 } 694 } 695 696 function toInt(argumentForCoercion) { 697 var coercedNumber = +argumentForCoercion, 698 value = 0; 699 700 if (coercedNumber !== 0 && isFinite(coercedNumber)) { 701 value = absFloor(coercedNumber); 702 } 703 704 return value; 705 } 706 707 function makeGetSet(unit, keepTime) { 708 return function (value) { 709 if (value != null) { 710 set$1(this, unit, value); 711 hooks.updateOffset(this, keepTime); 712 return this; 713 } else { 714 return get(this, unit); 715 } 716 }; 717 } 718 719 function get(mom, unit) { 720 return mom.isValid() 721 ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() 722 : NaN; 723 } 724 725 function set$1(mom, unit, value) { 726 if (mom.isValid() && !isNaN(value)) { 727 if ( 728 unit === 'FullYear' && 729 isLeapYear(mom.year()) && 730 mom.month() === 1 && 731 mom.date() === 29 732 ) { 733 value = toInt(value); 734 mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit]( 735 value, 736 mom.month(), 737 daysInMonth(value, mom.month()) 738 ); 739 } else { 740 mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); 741 } 742 } 743 } 744 745 // MOMENTS 746 747 function stringGet(units) { 748 units = normalizeUnits(units); 749 if (isFunction(this[units])) { 750 return this[units](); 751 } 752 return this; 753 } 754 755 function stringSet(units, value) { 756 if (typeof units === 'object') { 757 units = normalizeObjectUnits(units); 758 var prioritized = getPrioritizedUnits(units), 759 i, 760 prioritizedLen = prioritized.length; 761 for (i = 0; i < prioritizedLen; i++) { 762 this[prioritized[i].unit](units[prioritized[i].unit]); 763 } 764 } else { 765 units = normalizeUnits(units); 766 if (isFunction(this[units])) { 767 return this[units](value); 768 } 769 } 770 return this; 771 } 772 773 var match1 = /\d/, // 0 - 9 774 match2 = /\d\d/, // 00 - 99 775 match3 = /\d{3}/, // 000 - 999 776 match4 = /\d{4}/, // 0000 - 9999 777 match6 = /[+-]?\d{6}/, // -999999 - 999999 778 match1to2 = /\d\d?/, // 0 - 99 779 match3to4 = /\d\d\d\d?/, // 999 - 9999 780 match5to6 = /\d\d\d\d\d\d?/, // 99999 - 999999 781 match1to3 = /\d{1,3}/, // 0 - 999 782 match1to4 = /\d{1,4}/, // 0 - 9999 783 match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999 784 matchUnsigned = /\d+/, // 0 - inf 785 matchSigned = /[+-]?\d+/, // -inf - inf 786 matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z 787 matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z 788 matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 789 // any word (or two) characters or numbers including two/three word month in arabic. 790 // includes scottish gaelic two word and hyphenated months 791 matchWord = 792 /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, 793 regexes; 794 795 regexes = {}; 796 797 function addRegexToken(token, regex, strictRegex) { 798 regexes[token] = isFunction(regex) 799 ? regex 800 : function (isStrict, localeData) { 801 return isStrict && strictRegex ? strictRegex : regex; 802 }; 803 } 804 805 function getParseRegexForToken(token, config) { 806 if (!hasOwnProp(regexes, token)) { 807 return new RegExp(unescapeFormat(token)); 808 } 809 810 return regexes[token](config._strict, config._locale); 811 } 812 813 // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript 814 function unescapeFormat(s) { 815 return regexEscape( 816 s 817 .replace('\\', '') 818 .replace( 819 /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, 820 function (matched, p1, p2, p3, p4) { 821 return p1 || p2 || p3 || p4; 822 } 823 ) 824 ); 825 } 826 827 function regexEscape(s) { 828 return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 829 } 830 831 var tokens = {}; 832 833 function addParseToken(token, callback) { 834 var i, 835 func = callback, 836 tokenLen; 837 if (typeof token === 'string') { 838 token = [token]; 839 } 840 if (isNumber(callback)) { 841 func = function (input, array) { 842 array[callback] = toInt(input); 843 }; 844 } 845 tokenLen = token.length; 846 for (i = 0; i < tokenLen; i++) { 847 tokens[token[i]] = func; 848 } 849 } 850 851 function addWeekParseToken(token, callback) { 852 addParseToken(token, function (input, array, config, token) { 853 config._w = config._w || {}; 854 callback(input, config._w, config, token); 855 }); 856 } 857 858 function addTimeToArrayFromToken(token, input, config) { 859 if (input != null && hasOwnProp(tokens, token)) { 860 tokens[token](input, config._a, config, token); 861 } 862 } 863 864 var YEAR = 0, 865 MONTH = 1, 866 DATE = 2, 867 HOUR = 3, 868 MINUTE = 4, 869 SECOND = 5, 870 MILLISECOND = 6, 871 WEEK = 7, 872 WEEKDAY = 8; 873 874 function mod(n, x) { 875 return ((n % x) + x) % x; 876 } 877 878 var indexOf; 879 880 if (Array.prototype.indexOf) { 881 indexOf = Array.prototype.indexOf; 882 } else { 883 indexOf = function (o) { 884 // I know 885 var i; 886 for (i = 0; i < this.length; ++i) { 887 if (this[i] === o) { 888 return i; 889 } 890 } 891 return -1; 892 }; 893 } 894 895 function daysInMonth(year, month) { 896 if (isNaN(year) || isNaN(month)) { 897 return NaN; 898 } 899 var modMonth = mod(month, 12); 900 year += (month - modMonth) / 12; 901 return modMonth === 1 902 ? isLeapYear(year) 903 ? 29 904 : 28 905 : 31 - ((modMonth % 7) % 2); 906 } 907 908 // FORMATTING 909 910 addFormatToken('M', ['MM', 2], 'Mo', function () { 911 return this.month() + 1; 912 }); 913 914 addFormatToken('MMM', 0, 0, function (format) { 915 return this.localeData().monthsShort(this, format); 916 }); 917 918 addFormatToken('MMMM', 0, 0, function (format) { 919 return this.localeData().months(this, format); 920 }); 921 922 // ALIASES 923 924 addUnitAlias('month', 'M'); 925 926 // PRIORITY 927 928 addUnitPriority('month', 8); 929 930 // PARSING 931 932 addRegexToken('M', match1to2); 933 addRegexToken('MM', match1to2, match2); 934 addRegexToken('MMM', function (isStrict, locale) { 935 return locale.monthsShortRegex(isStrict); 936 }); 937 addRegexToken('MMMM', function (isStrict, locale) { 938 return locale.monthsRegex(isStrict); 939 }); 940 941 addParseToken(['M', 'MM'], function (input, array) { 942 array[MONTH] = toInt(input) - 1; 943 }); 944 945 addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { 946 var month = config._locale.monthsParse(input, token, config._strict); 947 // if we didn't find a month name, mark the date as invalid. 948 if (month != null) { 949 array[MONTH] = month; 950 } else { 951 getParsingFlags(config).invalidMonth = input; 952 } 953 }); 954 955 // LOCALES 956 957 var defaultLocaleMonths = 958 'January_February_March_April_May_June_July_August_September_October_November_December'.split( 959 '_' 960 ), 961 defaultLocaleMonthsShort = 962 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), 963 MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, 964 defaultMonthsShortRegex = matchWord, 965 defaultMonthsRegex = matchWord; 966 967 function localeMonths(m, format) { 968 if (!m) { 969 return isArray(this._months) 970 ? this._months 971 : this._months['standalone']; 972 } 973 return isArray(this._months) 974 ? this._months[m.month()] 975 : this._months[ 976 (this._months.isFormat || MONTHS_IN_FORMAT).test(format) 977 ? 'format' 978 : 'standalone' 979 ][m.month()]; 980 } 981 982 function localeMonthsShort(m, format) { 983 if (!m) { 984 return isArray(this._monthsShort) 985 ? this._monthsShort 986 : this._monthsShort['standalone']; 987 } 988 return isArray(this._monthsShort) 989 ? this._monthsShort[m.month()] 990 : this._monthsShort[ 991 MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone' 992 ][m.month()]; 993 } 994 995 function handleStrictParse(monthName, format, strict) { 996 var i, 997 ii, 998 mom, 999 llc = monthName.toLocaleLowerCase(); 1000 if (!this._monthsParse) { 1001 // this is not used 1002 this._monthsParse = []; 1003 this._longMonthsParse = []; 1004 this._shortMonthsParse = []; 1005 for (i = 0; i < 12; ++i) { 1006 mom = createUTC([2000, i]); 1007 this._shortMonthsParse[i] = this.monthsShort( 1008 mom, 1009 '' 1010 ).toLocaleLowerCase(); 1011 this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); 1012 } 1013 } 1014 1015 if (strict) { 1016 if (format === 'MMM') { 1017 ii = indexOf.call(this._shortMonthsParse, llc); 1018 return ii !== -1 ? ii : null; 1019 } else { 1020 ii = indexOf.call(this._longMonthsParse, llc); 1021 return ii !== -1 ? ii : null; 1022 } 1023 } else { 1024 if (format === 'MMM') { 1025 ii = indexOf.call(this._shortMonthsParse, llc); 1026 if (ii !== -1) { 1027 return ii; 1028 } 1029 ii = indexOf.call(this._longMonthsParse, llc); 1030 return ii !== -1 ? ii : null; 1031 } else { 1032 ii = indexOf.call(this._longMonthsParse, llc); 1033 if (ii !== -1) { 1034 return ii; 1035 } 1036 ii = indexOf.call(this._shortMonthsParse, llc); 1037 return ii !== -1 ? ii : null; 1038 } 1039 } 1040 } 1041 1042 function localeMonthsParse(monthName, format, strict) { 1043 var i, mom, regex; 1044 1045 if (this._monthsParseExact) { 1046 return handleStrictParse.call(this, monthName, format, strict); 1047 } 1048 1049 if (!this._monthsParse) { 1050 this._monthsParse = []; 1051 this._longMonthsParse = []; 1052 this._shortMonthsParse = []; 1053 } 1054 1055 // TODO: add sorting 1056 // Sorting makes sure if one month (or abbr) is a prefix of another 1057 // see sorting in computeMonthsParse 1058 for (i = 0; i < 12; i++) { 1059 // make the regex if we don't have it already 1060 mom = createUTC([2000, i]); 1061 if (strict && !this._longMonthsParse[i]) { 1062 this._longMonthsParse[i] = new RegExp( 1063 '^' + this.months(mom, '').replace('.', '') + '$', 1064 'i' 1065 ); 1066 this._shortMonthsParse[i] = new RegExp( 1067 '^' + this.monthsShort(mom, '').replace('.', '') + '$', 1068 'i' 1069 ); 1070 } 1071 if (!strict && !this._monthsParse[i]) { 1072 regex = 1073 '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); 1074 this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); 1075 } 1076 // test the regex 1077 if ( 1078 strict && 1079 format === 'MMMM' && 1080 this._longMonthsParse[i].test(monthName) 1081 ) { 1082 return i; 1083 } else if ( 1084 strict && 1085 format === 'MMM' && 1086 this._shortMonthsParse[i].test(monthName) 1087 ) { 1088 return i; 1089 } else if (!strict && this._monthsParse[i].test(monthName)) { 1090 return i; 1091 } 1092 } 1093 } 1094 1095 // MOMENTS 1096 1097 function setMonth(mom, value) { 1098 var dayOfMonth; 1099 1100 if (!mom.isValid()) { 1101 // No op 1102 return mom; 1103 } 1104 1105 if (typeof value === 'string') { 1106 if (/^\d+$/.test(value)) { 1107 value = toInt(value); 1108 } else { 1109 value = mom.localeData().monthsParse(value); 1110 // TODO: Another silent failure? 1111 if (!isNumber(value)) { 1112 return mom; 1113 } 1114 } 1115 } 1116 1117 dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); 1118 mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); 1119 return mom; 1120 } 1121 1122 function getSetMonth(value) { 1123 if (value != null) { 1124 setMonth(this, value); 1125 hooks.updateOffset(this, true); 1126 return this; 1127 } else { 1128 return get(this, 'Month'); 1129 } 1130 } 1131 1132 function getDaysInMonth() { 1133 return daysInMonth(this.year(), this.month()); 1134 } 1135 1136 function monthsShortRegex(isStrict) { 1137 if (this._monthsParseExact) { 1138 if (!hasOwnProp(this, '_monthsRegex')) { 1139 computeMonthsParse.call(this); 1140 } 1141 if (isStrict) { 1142 return this._monthsShortStrictRegex; 1143 } else { 1144 return this._monthsShortRegex; 1145 } 1146 } else { 1147 if (!hasOwnProp(this, '_monthsShortRegex')) { 1148 this._monthsShortRegex = defaultMonthsShortRegex; 1149 } 1150 return this._monthsShortStrictRegex && isStrict 1151 ? this._monthsShortStrictRegex 1152 : this._monthsShortRegex; 1153 } 1154 } 1155 1156 function monthsRegex(isStrict) { 1157 if (this._monthsParseExact) { 1158 if (!hasOwnProp(this, '_monthsRegex')) { 1159 computeMonthsParse.call(this); 1160 } 1161 if (isStrict) { 1162 return this._monthsStrictRegex; 1163 } else { 1164 return this._monthsRegex; 1165 } 1166 } else { 1167 if (!hasOwnProp(this, '_monthsRegex')) { 1168 this._monthsRegex = defaultMonthsRegex; 1169 } 1170 return this._monthsStrictRegex && isStrict 1171 ? this._monthsStrictRegex 1172 : this._monthsRegex; 1173 } 1174 } 1175 1176 function computeMonthsParse() { 1177 function cmpLenRev(a, b) { 1178 return b.length - a.length; 1179 } 1180 1181 var shortPieces = [], 1182 longPieces = [], 1183 mixedPieces = [], 1184 i, 1185 mom; 1186 for (i = 0; i < 12; i++) { 1187 // make the regex if we don't have it already 1188 mom = createUTC([2000, i]); 1189 shortPieces.push(this.monthsShort(mom, '')); 1190 longPieces.push(this.months(mom, '')); 1191 mixedPieces.push(this.months(mom, '')); 1192 mixedPieces.push(this.monthsShort(mom, '')); 1193 } 1194 // Sorting makes sure if one month (or abbr) is a prefix of another it 1195 // will match the longer piece. 1196 shortPieces.sort(cmpLenRev); 1197 longPieces.sort(cmpLenRev); 1198 mixedPieces.sort(cmpLenRev); 1199 for (i = 0; i < 12; i++) { 1200 shortPieces[i] = regexEscape(shortPieces[i]); 1201 longPieces[i] = regexEscape(longPieces[i]); 1202 } 1203 for (i = 0; i < 24; i++) { 1204 mixedPieces[i] = regexEscape(mixedPieces[i]); 1205 } 1206 1207 this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); 1208 this._monthsShortRegex = this._monthsRegex; 1209 this._monthsStrictRegex = new RegExp( 1210 '^(' + longPieces.join('|') + ')', 1211 'i' 1212 ); 1213 this._monthsShortStrictRegex = new RegExp( 1214 '^(' + shortPieces.join('|') + ')', 1215 'i' 1216 ); 1217 } 1218 1219 // FORMATTING 1220 1221 addFormatToken('Y', 0, 0, function () { 1222 var y = this.year(); 1223 return y <= 9999 ? zeroFill(y, 4) : '+' + y; 1224 }); 1225 1226 addFormatToken(0, ['YY', 2], 0, function () { 1227 return this.year() % 100; 1228 }); 1229 1230 addFormatToken(0, ['YYYY', 4], 0, 'year'); 1231 addFormatToken(0, ['YYYYY', 5], 0, 'year'); 1232 addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); 1233 1234 // ALIASES 1235 1236 addUnitAlias('year', 'y'); 1237 1238 // PRIORITIES 1239 1240 addUnitPriority('year', 1); 1241 1242 // PARSING 1243 1244 addRegexToken('Y', matchSigned); 1245 addRegexToken('YY', match1to2, match2); 1246 addRegexToken('YYYY', match1to4, match4); 1247 addRegexToken('YYYYY', match1to6, match6); 1248 addRegexToken('YYYYYY', match1to6, match6); 1249 1250 addParseToken(['YYYYY', 'YYYYYY'], YEAR); 1251 addParseToken('YYYY', function (input, array) { 1252 array[YEAR] = 1253 input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); 1254 }); 1255 addParseToken('YY', function (input, array) { 1256 array[YEAR] = hooks.parseTwoDigitYear(input); 1257 }); 1258 addParseToken('Y', function (input, array) { 1259 array[YEAR] = parseInt(input, 10); 1260 }); 1261 1262 // HELPERS 1263 1264 function daysInYear(year) { 1265 return isLeapYear(year) ? 366 : 365; 1266 } 1267 1268 // HOOKS 1269 1270 hooks.parseTwoDigitYear = function (input) { 1271 return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); 1272 }; 1273 1274 // MOMENTS 1275 1276 var getSetYear = makeGetSet('FullYear', true); 1277 1278 function getIsLeapYear() { 1279 return isLeapYear(this.year()); 1280 } 1281 1282 function createDate(y, m, d, h, M, s, ms) { 1283 // can't just apply() to create a date: 1284 // https://stackoverflow.com/q/181348 1285 var date; 1286 // the date constructor remaps years 0-99 to 1900-1999 1287 if (y < 100 && y >= 0) { 1288 // preserve leap years using a full 400 year cycle, then reset 1289 date = new Date(y + 400, m, d, h, M, s, ms); 1290 if (isFinite(date.getFullYear())) { 1291 date.setFullYear(y); 1292 } 1293 } else { 1294 date = new Date(y, m, d, h, M, s, ms); 1295 } 1296 1297 return date; 1298 } 1299 1300 function createUTCDate(y) { 1301 var date, args; 1302 // the Date.UTC function remaps years 0-99 to 1900-1999 1303 if (y < 100 && y >= 0) { 1304 args = Array.prototype.slice.call(arguments); 1305 // preserve leap years using a full 400 year cycle, then reset 1306 args[0] = y + 400; 1307 date = new Date(Date.UTC.apply(null, args)); 1308 if (isFinite(date.getUTCFullYear())) { 1309 date.setUTCFullYear(y); 1310 } 1311 } else { 1312 date = new Date(Date.UTC.apply(null, arguments)); 1313 } 1314 1315 return date; 1316 } 1317 1318 // start-of-first-week - start-of-year 1319 function firstWeekOffset(year, dow, doy) { 1320 var // first-week day -- which january is always in the first week (4 for iso, 1 for other) 1321 fwd = 7 + dow - doy, 1322 // first-week day local weekday -- which local weekday is fwd 1323 fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; 1324 1325 return -fwdlw + fwd - 1; 1326 } 1327 1328 // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday 1329 function dayOfYearFromWeeks(year, week, weekday, dow, doy) { 1330 var localWeekday = (7 + weekday - dow) % 7, 1331 weekOffset = firstWeekOffset(year, dow, doy), 1332 dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, 1333 resYear, 1334 resDayOfYear; 1335 1336 if (dayOfYear <= 0) { 1337 resYear = year - 1; 1338 resDayOfYear = daysInYear(resYear) + dayOfYear; 1339 } else if (dayOfYear > daysInYear(year)) { 1340 resYear = year + 1; 1341 resDayOfYear = dayOfYear - daysInYear(year); 1342 } else { 1343 resYear = year; 1344 resDayOfYear = dayOfYear; 1345 } 1346 1347 return { 1348 year: resYear, 1349 dayOfYear: resDayOfYear, 1350 }; 1351 } 1352 1353 function weekOfYear(mom, dow, doy) { 1354 var weekOffset = firstWeekOffset(mom.year(), dow, doy), 1355 week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, 1356 resWeek, 1357 resYear; 1358 1359 if (week < 1) { 1360 resYear = mom.year() - 1; 1361 resWeek = week + weeksInYear(resYear, dow, doy); 1362 } else if (week > weeksInYear(mom.year(), dow, doy)) { 1363 resWeek = week - weeksInYear(mom.year(), dow, doy); 1364 resYear = mom.year() + 1; 1365 } else { 1366 resYear = mom.year(); 1367 resWeek = week; 1368 } 1369 1370 return { 1371 week: resWeek, 1372 year: resYear, 1373 }; 1374 } 1375 1376 function weeksInYear(year, dow, doy) { 1377 var weekOffset = firstWeekOffset(year, dow, doy), 1378 weekOffsetNext = firstWeekOffset(year + 1, dow, doy); 1379 return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; 1380 } 1381 1382 // FORMATTING 1383 1384 addFormatToken('w', ['ww', 2], 'wo', 'week'); 1385 addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); 1386 1387 // ALIASES 1388 1389 addUnitAlias('week', 'w'); 1390 addUnitAlias('isoWeek', 'W'); 1391 1392 // PRIORITIES 1393 1394 addUnitPriority('week', 5); 1395 addUnitPriority('isoWeek', 5); 1396 1397 // PARSING 1398 1399 addRegexToken('w', match1to2); 1400 addRegexToken('ww', match1to2, match2); 1401 addRegexToken('W', match1to2); 1402 addRegexToken('WW', match1to2, match2); 1403 1404 addWeekParseToken( 1405 ['w', 'ww', 'W', 'WW'], 1406 function (input, week, config, token) { 1407 week[token.substr(0, 1)] = toInt(input); 1408 } 1409 ); 1410 1411 // HELPERS 1412 1413 // LOCALES 1414 1415 function localeWeek(mom) { 1416 return weekOfYear(mom, this._week.dow, this._week.doy).week; 1417 } 1418 1419 var defaultLocaleWeek = { 1420 dow: 0, // Sunday is the first day of the week. 1421 doy: 6, // The week that contains Jan 6th is the first week of the year. 1422 }; 1423 1424 function localeFirstDayOfWeek() { 1425 return this._week.dow; 1426 } 1427 1428 function localeFirstDayOfYear() { 1429 return this._week.doy; 1430 } 1431 1432 // MOMENTS 1433 1434 function getSetWeek(input) { 1435 var week = this.localeData().week(this); 1436 return input == null ? week : this.add((input - week) * 7, 'd'); 1437 } 1438 1439 function getSetISOWeek(input) { 1440 var week = weekOfYear(this, 1, 4).week; 1441 return input == null ? week : this.add((input - week) * 7, 'd'); 1442 } 1443 1444 // FORMATTING 1445 1446 addFormatToken('d', 0, 'do', 'day'); 1447 1448 addFormatToken('dd', 0, 0, function (format) { 1449 return this.localeData().weekdaysMin(this, format); 1450 }); 1451 1452 addFormatToken('ddd', 0, 0, function (format) { 1453 return this.localeData().weekdaysShort(this, format); 1454 }); 1455 1456 addFormatToken('dddd', 0, 0, function (format) { 1457 return this.localeData().weekdays(this, format); 1458 }); 1459 1460 addFormatToken('e', 0, 0, 'weekday'); 1461 addFormatToken('E', 0, 0, 'isoWeekday'); 1462 1463 // ALIASES 1464 1465 addUnitAlias('day', 'd'); 1466 addUnitAlias('weekday', 'e'); 1467 addUnitAlias('isoWeekday', 'E'); 1468 1469 // PRIORITY 1470 addUnitPriority('day', 11); 1471 addUnitPriority('weekday', 11); 1472 addUnitPriority('isoWeekday', 11); 1473 1474 // PARSING 1475 1476 addRegexToken('d', match1to2); 1477 addRegexToken('e', match1to2); 1478 addRegexToken('E', match1to2); 1479 addRegexToken('dd', function (isStrict, locale) { 1480 return locale.weekdaysMinRegex(isStrict); 1481 }); 1482 addRegexToken('ddd', function (isStrict, locale) { 1483 return locale.weekdaysShortRegex(isStrict); 1484 }); 1485 addRegexToken('dddd', function (isStrict, locale) { 1486 return locale.weekdaysRegex(isStrict); 1487 }); 1488 1489 addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { 1490 var weekday = config._locale.weekdaysParse(input, token, config._strict); 1491 // if we didn't get a weekday name, mark the date as invalid 1492 if (weekday != null) { 1493 week.d = weekday; 1494 } else { 1495 getParsingFlags(config).invalidWeekday = input; 1496 } 1497 }); 1498 1499 addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { 1500 week[token] = toInt(input); 1501 }); 1502 1503 // HELPERS 1504 1505 function parseWeekday(input, locale) { 1506 if (typeof input !== 'string') { 1507 return input; 1508 } 1509 1510 if (!isNaN(input)) { 1511 return parseInt(input, 10); 1512 } 1513 1514 input = locale.weekdaysParse(input); 1515 if (typeof input === 'number') { 1516 return input; 1517 } 1518 1519 return null; 1520 } 1521 1522 function parseIsoWeekday(input, locale) { 1523 if (typeof input === 'string') { 1524 return locale.weekdaysParse(input) % 7 || 7; 1525 } 1526 return isNaN(input) ? null : input; 1527 } 1528 1529 // LOCALES 1530 function shiftWeekdays(ws, n) { 1531 return ws.slice(n, 7).concat(ws.slice(0, n)); 1532 } 1533 1534 var defaultLocaleWeekdays = 1535 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), 1536 defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), 1537 defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), 1538 defaultWeekdaysRegex = matchWord, 1539 defaultWeekdaysShortRegex = matchWord, 1540 defaultWeekdaysMinRegex = matchWord; 1541 1542 function localeWeekdays(m, format) { 1543 var weekdays = isArray(this._weekdays) 1544 ? this._weekdays 1545 : this._weekdays[ 1546 m && m !== true && this._weekdays.isFormat.test(format) 1547 ? 'format' 1548 : 'standalone' 1549 ]; 1550 return m === true 1551 ? shiftWeekdays(weekdays, this._week.dow) 1552 : m 1553 ? weekdays[m.day()] 1554 : weekdays; 1555 } 1556 1557 function localeWeekdaysShort(m) { 1558 return m === true 1559 ? shiftWeekdays(this._weekdaysShort, this._week.dow) 1560 : m 1561 ? this._weekdaysShort[m.day()] 1562 : this._weekdaysShort; 1563 } 1564 1565 function localeWeekdaysMin(m) { 1566 return m === true 1567 ? shiftWeekdays(this._weekdaysMin, this._week.dow) 1568 : m 1569 ? this._weekdaysMin[m.day()] 1570 : this._weekdaysMin; 1571 } 1572 1573 function handleStrictParse$1(weekdayName, format, strict) { 1574 var i, 1575 ii, 1576 mom, 1577 llc = weekdayName.toLocaleLowerCase(); 1578 if (!this._weekdaysParse) { 1579 this._weekdaysParse = []; 1580 this._shortWeekdaysParse = []; 1581 this._minWeekdaysParse = []; 1582 1583 for (i = 0; i < 7; ++i) { 1584 mom = createUTC([2000, 1]).day(i); 1585 this._minWeekdaysParse[i] = this.weekdaysMin( 1586 mom, 1587 '' 1588 ).toLocaleLowerCase(); 1589 this._shortWeekdaysParse[i] = this.weekdaysShort( 1590 mom, 1591 '' 1592 ).toLocaleLowerCase(); 1593 this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); 1594 } 1595 } 1596 1597 if (strict) { 1598 if (format === 'dddd') { 1599 ii = indexOf.call(this._weekdaysParse, llc); 1600 return ii !== -1 ? ii : null; 1601 } else if (format === 'ddd') { 1602 ii = indexOf.call(this._shortWeekdaysParse, llc); 1603 return ii !== -1 ? ii : null; 1604 } else { 1605 ii = indexOf.call(this._minWeekdaysParse, llc); 1606 return ii !== -1 ? ii : null; 1607 } 1608 } else { 1609 if (format === 'dddd') { 1610 ii = indexOf.call(this._weekdaysParse, llc); 1611 if (ii !== -1) { 1612 return ii; 1613 } 1614 ii = indexOf.call(this._shortWeekdaysParse, llc); 1615 if (ii !== -1) { 1616 return ii; 1617 } 1618 ii = indexOf.call(this._minWeekdaysParse, llc); 1619 return ii !== -1 ? ii : null; 1620 } else if (format === 'ddd') { 1621 ii = indexOf.call(this._shortWeekdaysParse, llc); 1622 if (ii !== -1) { 1623 return ii; 1624 } 1625 ii = indexOf.call(this._weekdaysParse, llc); 1626 if (ii !== -1) { 1627 return ii; 1628 } 1629 ii = indexOf.call(this._minWeekdaysParse, llc); 1630 return ii !== -1 ? ii : null; 1631 } else { 1632 ii = indexOf.call(this._minWeekdaysParse, llc); 1633 if (ii !== -1) { 1634 return ii; 1635 } 1636 ii = indexOf.call(this._weekdaysParse, llc); 1637 if (ii !== -1) { 1638 return ii; 1639 } 1640 ii = indexOf.call(this._shortWeekdaysParse, llc); 1641 return ii !== -1 ? ii : null; 1642 } 1643 } 1644 } 1645 1646 function localeWeekdaysParse(weekdayName, format, strict) { 1647 var i, mom, regex; 1648 1649 if (this._weekdaysParseExact) { 1650 return handleStrictParse$1.call(this, weekdayName, format, strict); 1651 } 1652 1653 if (!this._weekdaysParse) { 1654 this._weekdaysParse = []; 1655 this._minWeekdaysParse = []; 1656 this._shortWeekdaysParse = []; 1657 this._fullWeekdaysParse = []; 1658 } 1659 1660 for (i = 0; i < 7; i++) { 1661 // make the regex if we don't have it already 1662 1663 mom = createUTC([2000, 1]).day(i); 1664 if (strict && !this._fullWeekdaysParse[i]) { 1665 this._fullWeekdaysParse[i] = new RegExp( 1666 '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 1667 'i' 1668 ); 1669 this._shortWeekdaysParse[i] = new RegExp( 1670 '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 1671 'i' 1672 ); 1673 this._minWeekdaysParse[i] = new RegExp( 1674 '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 1675 'i' 1676 ); 1677 } 1678 if (!this._weekdaysParse[i]) { 1679 regex = 1680 '^' + 1681 this.weekdays(mom, '') + 1682 '|^' + 1683 this.weekdaysShort(mom, '') + 1684 '|^' + 1685 this.weekdaysMin(mom, ''); 1686 this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); 1687 } 1688 // test the regex 1689 if ( 1690 strict && 1691 format === 'dddd' && 1692 this._fullWeekdaysParse[i].test(weekdayName) 1693 ) { 1694 return i; 1695 } else if ( 1696 strict && 1697 format === 'ddd' && 1698 this._shortWeekdaysParse[i].test(weekdayName) 1699 ) { 1700 return i; 1701 } else if ( 1702 strict && 1703 format === 'dd' && 1704 this._minWeekdaysParse[i].test(weekdayName) 1705 ) { 1706 return i; 1707 } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { 1708 return i; 1709 } 1710 } 1711 } 1712 1713 // MOMENTS 1714 1715 function getSetDayOfWeek(input) { 1716 if (!this.isValid()) { 1717 return input != null ? this : NaN; 1718 } 1719 var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); 1720 if (input != null) { 1721 input = parseWeekday(input, this.localeData()); 1722 return this.add(input - day, 'd'); 1723 } else { 1724 return day; 1725 } 1726 } 1727 1728 function getSetLocaleDayOfWeek(input) { 1729 if (!this.isValid()) { 1730 return input != null ? this : NaN; 1731 } 1732 var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; 1733 return input == null ? weekday : this.add(input - weekday, 'd'); 1734 } 1735 1736 function getSetISODayOfWeek(input) { 1737 if (!this.isValid()) { 1738 return input != null ? this : NaN; 1739 } 1740 1741 // behaves the same as moment#day except 1742 // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) 1743 // as a setter, sunday should belong to the previous week. 1744 1745 if (input != null) { 1746 var weekday = parseIsoWeekday(input, this.localeData()); 1747 return this.day(this.day() % 7 ? weekday : weekday - 7); 1748 } else { 1749 return this.day() || 7; 1750 } 1751 } 1752 1753 function weekdaysRegex(isStrict) { 1754 if (this._weekdaysParseExact) { 1755 if (!hasOwnProp(this, '_weekdaysRegex')) { 1756 computeWeekdaysParse.call(this); 1757 } 1758 if (isStrict) { 1759 return this._weekdaysStrictRegex; 1760 } else { 1761 return this._weekdaysRegex; 1762 } 1763 } else { 1764 if (!hasOwnProp(this, '_weekdaysRegex')) { 1765 this._weekdaysRegex = defaultWeekdaysRegex; 1766 } 1767 return this._weekdaysStrictRegex && isStrict 1768 ? this._weekdaysStrictRegex 1769 : this._weekdaysRegex; 1770 } 1771 } 1772 1773 function weekdaysShortRegex(isStrict) { 1774 if (this._weekdaysParseExact) { 1775 if (!hasOwnProp(this, '_weekdaysRegex')) { 1776 computeWeekdaysParse.call(this); 1777 } 1778 if (isStrict) { 1779 return this._weekdaysShortStrictRegex; 1780 } else { 1781 return this._weekdaysShortRegex; 1782 } 1783 } else { 1784 if (!hasOwnProp(this, '_weekdaysShortRegex')) { 1785 this._weekdaysShortRegex = defaultWeekdaysShortRegex; 1786 } 1787 return this._weekdaysShortStrictRegex && isStrict 1788 ? this._weekdaysShortStrictRegex 1789 : this._weekdaysShortRegex; 1790 } 1791 } 1792 1793 function weekdaysMinRegex(isStrict) { 1794 if (this._weekdaysParseExact) { 1795 if (!hasOwnProp(this, '_weekdaysRegex')) { 1796 computeWeekdaysParse.call(this); 1797 } 1798 if (isStrict) { 1799 return this._weekdaysMinStrictRegex; 1800 } else { 1801 return this._weekdaysMinRegex; 1802 } 1803 } else { 1804 if (!hasOwnProp(this, '_weekdaysMinRegex')) { 1805 this._weekdaysMinRegex = defaultWeekdaysMinRegex; 1806 } 1807 return this._weekdaysMinStrictRegex && isStrict 1808 ? this._weekdaysMinStrictRegex 1809 : this._weekdaysMinRegex; 1810 } 1811 } 1812 1813 function computeWeekdaysParse() { 1814 function cmpLenRev(a, b) { 1815 return b.length - a.length; 1816 } 1817 1818 var minPieces = [], 1819 shortPieces = [], 1820 longPieces = [], 1821 mixedPieces = [], 1822 i, 1823 mom, 1824 minp, 1825 shortp, 1826 longp; 1827 for (i = 0; i < 7; i++) { 1828 // make the regex if we don't have it already 1829 mom = createUTC([2000, 1]).day(i); 1830 minp = regexEscape(this.weekdaysMin(mom, '')); 1831 shortp = regexEscape(this.weekdaysShort(mom, '')); 1832 longp = regexEscape(this.weekdays(mom, '')); 1833 minPieces.push(minp); 1834 shortPieces.push(shortp); 1835 longPieces.push(longp); 1836 mixedPieces.push(minp); 1837 mixedPieces.push(shortp); 1838 mixedPieces.push(longp); 1839 } 1840 // Sorting makes sure if one weekday (or abbr) is a prefix of another it 1841 // will match the longer piece. 1842 minPieces.sort(cmpLenRev); 1843 shortPieces.sort(cmpLenRev); 1844 longPieces.sort(cmpLenRev); 1845 mixedPieces.sort(cmpLenRev); 1846 1847 this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); 1848 this._weekdaysShortRegex = this._weekdaysRegex; 1849 this._weekdaysMinRegex = this._weekdaysRegex; 1850 1851 this._weekdaysStrictRegex = new RegExp( 1852 '^(' + longPieces.join('|') + ')', 1853 'i' 1854 ); 1855 this._weekdaysShortStrictRegex = new RegExp( 1856 '^(' + shortPieces.join('|') + ')', 1857 'i' 1858 ); 1859 this._weekdaysMinStrictRegex = new RegExp( 1860 '^(' + minPieces.join('|') + ')', 1861 'i' 1862 ); 1863 } 1864 1865 // FORMATTING 1866 1867 function hFormat() { 1868 return this.hours() % 12 || 12; 1869 } 1870 1871 function kFormat() { 1872 return this.hours() || 24; 1873 } 1874 1875 addFormatToken('H', ['HH', 2], 0, 'hour'); 1876 addFormatToken('h', ['hh', 2], 0, hFormat); 1877 addFormatToken('k', ['kk', 2], 0, kFormat); 1878 1879 addFormatToken('hmm', 0, 0, function () { 1880 return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); 1881 }); 1882 1883 addFormatToken('hmmss', 0, 0, function () { 1884 return ( 1885 '' + 1886 hFormat.apply(this) + 1887 zeroFill(this.minutes(), 2) + 1888 zeroFill(this.seconds(), 2) 1889 ); 1890 }); 1891 1892 addFormatToken('Hmm', 0, 0, function () { 1893 return '' + this.hours() + zeroFill(this.minutes(), 2); 1894 }); 1895 1896 addFormatToken('Hmmss', 0, 0, function () { 1897 return ( 1898 '' + 1899 this.hours() + 1900 zeroFill(this.minutes(), 2) + 1901 zeroFill(this.seconds(), 2) 1902 ); 1903 }); 1904 1905 function meridiem(token, lowercase) { 1906 addFormatToken(token, 0, 0, function () { 1907 return this.localeData().meridiem( 1908 this.hours(), 1909 this.minutes(), 1910 lowercase 1911 ); 1912 }); 1913 } 1914 1915 meridiem('a', true); 1916 meridiem('A', false); 1917 1918 // ALIASES 1919 1920 addUnitAlias('hour', 'h'); 1921 1922 // PRIORITY 1923 addUnitPriority('hour', 13); 1924 1925 // PARSING 1926 1927 function matchMeridiem(isStrict, locale) { 1928 return locale._meridiemParse; 1929 } 1930 1931 addRegexToken('a', matchMeridiem); 1932 addRegexToken('A', matchMeridiem); 1933 addRegexToken('H', match1to2); 1934 addRegexToken('h', match1to2); 1935 addRegexToken('k', match1to2); 1936 addRegexToken('HH', match1to2, match2); 1937 addRegexToken('hh', match1to2, match2); 1938 addRegexToken('kk', match1to2, match2); 1939 1940 addRegexToken('hmm', match3to4); 1941 addRegexToken('hmmss', match5to6); 1942 addRegexToken('Hmm', match3to4); 1943 addRegexToken('Hmmss', match5to6); 1944 1945 addParseToken(['H', 'HH'], HOUR); 1946 addParseToken(['k', 'kk'], function (input, array, config) { 1947 var kInput = toInt(input); 1948 array[HOUR] = kInput === 24 ? 0 : kInput; 1949 }); 1950 addParseToken(['a', 'A'], function (input, array, config) { 1951 config._isPm = config._locale.isPM(input); 1952 config._meridiem = input; 1953 }); 1954 addParseToken(['h', 'hh'], function (input, array, config) { 1955 array[HOUR] = toInt(input); 1956 getParsingFlags(config).bigHour = true; 1957 }); 1958 addParseToken('hmm', function (input, array, config) { 1959 var pos = input.length - 2; 1960 array[HOUR] = toInt(input.substr(0, pos)); 1961 array[MINUTE] = toInt(input.substr(pos)); 1962 getParsingFlags(config).bigHour = true; 1963 }); 1964 addParseToken('hmmss', function (input, array, config) { 1965 var pos1 = input.length - 4, 1966 pos2 = input.length - 2; 1967 array[HOUR] = toInt(input.substr(0, pos1)); 1968 array[MINUTE] = toInt(input.substr(pos1, 2)); 1969 array[SECOND] = toInt(input.substr(pos2)); 1970 getParsingFlags(config).bigHour = true; 1971 }); 1972 addParseToken('Hmm', function (input, array, config) { 1973 var pos = input.length - 2; 1974 array[HOUR] = toInt(input.substr(0, pos)); 1975 array[MINUTE] = toInt(input.substr(pos)); 1976 }); 1977 addParseToken('Hmmss', function (input, array, config) { 1978 var pos1 = input.length - 4, 1979 pos2 = input.length - 2; 1980 array[HOUR] = toInt(input.substr(0, pos1)); 1981 array[MINUTE] = toInt(input.substr(pos1, 2)); 1982 array[SECOND] = toInt(input.substr(pos2)); 1983 }); 1984 1985 // LOCALES 1986 1987 function localeIsPM(input) { 1988 // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays 1989 // Using charAt should be more compatible. 1990 return (input + '').toLowerCase().charAt(0) === 'p'; 1991 } 1992 1993 var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i, 1994 // Setting the hour should keep the time, because the user explicitly 1995 // specified which hour they want. So trying to maintain the same hour (in 1996 // a new timezone) makes sense. Adding/subtracting hours does not follow 1997 // this rule. 1998 getSetHour = makeGetSet('Hours', true); 1999 2000 function localeMeridiem(hours, minutes, isLower) { 2001 if (hours > 11) { 2002 return isLower ? 'pm' : 'PM'; 2003 } else { 2004 return isLower ? 'am' : 'AM'; 2005 } 2006 } 2007 2008 var baseConfig = { 2009 calendar: defaultCalendar, 2010 longDateFormat: defaultLongDateFormat, 2011 invalidDate: defaultInvalidDate, 2012 ordinal: defaultOrdinal, 2013 dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, 2014 relativeTime: defaultRelativeTime, 2015 2016 months: defaultLocaleMonths, 2017 monthsShort: defaultLocaleMonthsShort, 2018 2019 week: defaultLocaleWeek, 2020 2021 weekdays: defaultLocaleWeekdays, 2022 weekdaysMin: defaultLocaleWeekdaysMin, 2023 weekdaysShort: defaultLocaleWeekdaysShort, 2024 2025 meridiemParse: defaultLocaleMeridiemParse, 2026 }; 2027 2028 // internal storage for locale config files 2029 var locales = {}, 2030 localeFamilies = {}, 2031 globalLocale; 2032 2033 function commonPrefix(arr1, arr2) { 2034 var i, 2035 minl = Math.min(arr1.length, arr2.length); 2036 for (i = 0; i < minl; i += 1) { 2037 if (arr1[i] !== arr2[i]) { 2038 return i; 2039 } 2040 } 2041 return minl; 2042 } 2043 2044 function normalizeLocale(key) { 2045 return key ? key.toLowerCase().replace('_', '-') : key; 2046 } 2047 2048 // pick the locale from the array 2049 // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each 2050 // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root 2051 function chooseLocale(names) { 2052 var i = 0, 2053 j, 2054 next, 2055 locale, 2056 split; 2057 2058 while (i < names.length) { 2059 split = normalizeLocale(names[i]).split('-'); 2060 j = split.length; 2061 next = normalizeLocale(names[i + 1]); 2062 next = next ? next.split('-') : null; 2063 while (j > 0) { 2064 locale = loadLocale(split.slice(0, j).join('-')); 2065 if (locale) { 2066 return locale; 2067 } 2068 if ( 2069 next && 2070 next.length >= j && 2071 commonPrefix(split, next) >= j - 1 2072 ) { 2073 //the next array item is better than a shallower substring of this one 2074 break; 2075 } 2076 j--; 2077 } 2078 i++; 2079 } 2080 return globalLocale; 2081 } 2082 2083 function isLocaleNameSane(name) { 2084 // Prevent names that look like filesystem paths, i.e contain '/' or '\' 2085 return name.match('^[^/\\\\]*$') != null; 2086 } 2087 2088 function loadLocale(name) { 2089 var oldLocale = null, 2090 aliasedRequire; 2091 // TODO: Find a better way to register and load all the locales in Node 2092 if ( 2093 locales[name] === undefined && 2094 typeof module !== 'undefined' && 2095 module && 2096 module.exports && 2097 isLocaleNameSane(name) 2098 ) { 2099 try { 2100 oldLocale = globalLocale._abbr; 2101 aliasedRequire = require; 2102 aliasedRequire('./locale/' + name); 2103 getSetGlobalLocale(oldLocale); 2104 } catch (e) { 2105 // mark as not found to avoid repeating expensive file require call causing high CPU 2106 // when trying to find en-US, en_US, en-us for every format call 2107 locales[name] = null; // null means not found 2108 } 2109 } 2110 return locales[name]; 2111 } 2112 2113 // This function will load locale and then set the global locale. If 2114 // no arguments are passed in, it will simply return the current global 2115 // locale key. 2116 function getSetGlobalLocale(key, values) { 2117 var data; 2118 if (key) { 2119 if (isUndefined(values)) { 2120 data = getLocale(key); 2121 } else { 2122 data = defineLocale(key, values); 2123 } 2124 2125 if (data) { 2126 // moment.duration._locale = moment._locale = data; 2127 globalLocale = data; 2128 } else { 2129 if (typeof console !== 'undefined' && console.warn) { 2130 //warn user if arguments are passed but the locale could not be set 2131 console.warn( 2132 'Locale ' + key + ' not found. Did you forget to load it?' 2133 ); 2134 } 2135 } 2136 } 2137 2138 return globalLocale._abbr; 2139 } 2140 2141 function defineLocale(name, config) { 2142 if (config !== null) { 2143 var locale, 2144 parentConfig = baseConfig; 2145 config.abbr = name; 2146 if (locales[name] != null) { 2147 deprecateSimple( 2148 'defineLocaleOverride', 2149 'use moment.updateLocale(localeName, config) to change ' + 2150 'an existing locale. moment.defineLocale(localeName, ' + 2151 'config) should only be used for creating a new locale ' + 2152 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.' 2153 ); 2154 parentConfig = locales[name]._config; 2155 } else if (config.parentLocale != null) { 2156 if (locales[config.parentLocale] != null) { 2157 parentConfig = locales[config.parentLocale]._config; 2158 } else { 2159 locale = loadLocale(config.parentLocale); 2160 if (locale != null) { 2161 parentConfig = locale._config; 2162 } else { 2163 if (!localeFamilies[config.parentLocale]) { 2164 localeFamilies[config.parentLocale] = []; 2165 } 2166 localeFamilies[config.parentLocale].push({ 2167 name: name, 2168 config: config, 2169 }); 2170 return null; 2171 } 2172 } 2173 } 2174 locales[name] = new Locale(mergeConfigs(parentConfig, config)); 2175 2176 if (localeFamilies[name]) { 2177 localeFamilies[name].forEach(function (x) { 2178 defineLocale(x.name, x.config); 2179 }); 2180 } 2181 2182 // backwards compat for now: also set the locale 2183 // make sure we set the locale AFTER all child locales have been 2184 // created, so we won't end up with the child locale set. 2185 getSetGlobalLocale(name); 2186 2187 return locales[name]; 2188 } else { 2189 // useful for testing 2190 delete locales[name]; 2191 return null; 2192 } 2193 } 2194 2195 function updateLocale(name, config) { 2196 if (config != null) { 2197 var locale, 2198 tmpLocale, 2199 parentConfig = baseConfig; 2200 2201 if (locales[name] != null && locales[name].parentLocale != null) { 2202 // Update existing child locale in-place to avoid memory-leaks 2203 locales[name].set(mergeConfigs(locales[name]._config, config)); 2204 } else { 2205 // MERGE 2206 tmpLocale = loadLocale(name); 2207 if (tmpLocale != null) { 2208 parentConfig = tmpLocale._config; 2209 } 2210 config = mergeConfigs(parentConfig, config); 2211 if (tmpLocale == null) { 2212 // updateLocale is called for creating a new locale 2213 // Set abbr so it will have a name (getters return 2214 // undefined otherwise). 2215 config.abbr = name; 2216 } 2217 locale = new Locale(config); 2218 locale.parentLocale = locales[name]; 2219 locales[name] = locale; 2220 } 2221 2222 // backwards compat for now: also set the locale 2223 getSetGlobalLocale(name); 2224 } else { 2225 // pass null for config to unupdate, useful for tests 2226 if (locales[name] != null) { 2227 if (locales[name].parentLocale != null) { 2228 locales[name] = locales[name].parentLocale; 2229 if (name === getSetGlobalLocale()) { 2230 getSetGlobalLocale(name); 2231 } 2232 } else if (locales[name] != null) { 2233 delete locales[name]; 2234 } 2235 } 2236 } 2237 return locales[name]; 2238 } 2239 2240 // returns locale data 2241 function getLocale(key) { 2242 var locale; 2243 2244 if (key && key._locale && key._locale._abbr) { 2245 key = key._locale._abbr; 2246 } 2247 2248 if (!key) { 2249 return globalLocale; 2250 } 2251 2252 if (!isArray(key)) { 2253 //short-circuit everything else 2254 locale = loadLocale(key); 2255 if (locale) { 2256 return locale; 2257 } 2258 key = [key]; 2259 } 2260 2261 return chooseLocale(key); 2262 } 2263 2264 function listLocales() { 2265 return keys(locales); 2266 } 2267 2268 function checkOverflow(m) { 2269 var overflow, 2270 a = m._a; 2271 2272 if (a && getParsingFlags(m).overflow === -2) { 2273 overflow = 2274 a[MONTH] < 0 || a[MONTH] > 11 2275 ? MONTH 2276 : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) 2277 ? DATE 2278 : a[HOUR] < 0 || 2279 a[HOUR] > 24 || 2280 (a[HOUR] === 24 && 2281 (a[MINUTE] !== 0 || 2282 a[SECOND] !== 0 || 2283 a[MILLISECOND] !== 0)) 2284 ? HOUR 2285 : a[MINUTE] < 0 || a[MINUTE] > 59 2286 ? MINUTE 2287 : a[SECOND] < 0 || a[SECOND] > 59 2288 ? SECOND 2289 : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 2290 ? MILLISECOND 2291 : -1; 2292 2293 if ( 2294 getParsingFlags(m)._overflowDayOfYear && 2295 (overflow < YEAR || overflow > DATE) 2296 ) { 2297 overflow = DATE; 2298 } 2299 if (getParsingFlags(m)._overflowWeeks && overflow === -1) { 2300 overflow = WEEK; 2301 } 2302 if (getParsingFlags(m)._overflowWeekday && overflow === -1) { 2303 overflow = WEEKDAY; 2304 } 2305 2306 getParsingFlags(m).overflow = overflow; 2307 } 2308 2309 return m; 2310 } 2311 2312 // iso 8601 regex 2313 // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) 2314 var extendedIsoRegex = 2315 /^\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)?)?$/, 2316 basicIsoRegex = 2317 /^\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)?)?$/, 2318 tzRegex = /Z|[+-]\d\d(?::?\d\d)?/, 2319 isoDates = [ 2320 ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], 2321 ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], 2322 ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], 2323 ['GGGG-[W]WW', /\d{4}-W\d\d/, false], 2324 ['YYYY-DDD', /\d{4}-\d{3}/], 2325 ['YYYY-MM', /\d{4}-\d\d/, false], 2326 ['YYYYYYMMDD', /[+-]\d{10}/], 2327 ['YYYYMMDD', /\d{8}/], 2328 ['GGGG[W]WWE', /\d{4}W\d{3}/], 2329 ['GGGG[W]WW', /\d{4}W\d{2}/, false], 2330 ['YYYYDDD', /\d{7}/], 2331 ['YYYYMM', /\d{6}/, false], 2332 ['YYYY', /\d{4}/, false], 2333 ], 2334 // iso time formats and regexes 2335 isoTimes = [ 2336 ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], 2337 ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], 2338 ['HH:mm:ss', /\d\d:\d\d:\d\d/], 2339 ['HH:mm', /\d\d:\d\d/], 2340 ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], 2341 ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], 2342 ['HHmmss', /\d\d\d\d\d\d/], 2343 ['HHmm', /\d\d\d\d/], 2344 ['HH', /\d\d/], 2345 ], 2346 aspNetJsonRegex = /^\/?Date\((-?\d+)/i, 2347 // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 2348 rfc2822 = 2349 /^(?:(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}))$/, 2350 obsOffsets = { 2351 UT: 0, 2352 GMT: 0, 2353 EDT: -4 * 60, 2354 EST: -5 * 60, 2355 CDT: -5 * 60, 2356 CST: -6 * 60, 2357 MDT: -6 * 60, 2358 MST: -7 * 60, 2359 PDT: -7 * 60, 2360 PST: -8 * 60, 2361 }; 2362 2363 // date from iso format 2364 function configFromISO(config) { 2365 var i, 2366 l, 2367 string = config._i, 2368 match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), 2369 allowTime, 2370 dateFormat, 2371 timeFormat, 2372 tzFormat, 2373 isoDatesLen = isoDates.length, 2374 isoTimesLen = isoTimes.length; 2375 2376 if (match) { 2377 getParsingFlags(config).iso = true; 2378 for (i = 0, l = isoDatesLen; i < l; i++) { 2379 if (isoDates[i][1].exec(match[1])) { 2380 dateFormat = isoDates[i][0]; 2381 allowTime = isoDates[i][2] !== false; 2382 break; 2383 } 2384 } 2385 if (dateFormat == null) { 2386 config._isValid = false; 2387 return; 2388 } 2389 if (match[3]) { 2390 for (i = 0, l = isoTimesLen; i < l; i++) { 2391 if (isoTimes[i][1].exec(match[3])) { 2392 // match[2] should be 'T' or space 2393 timeFormat = (match[2] || ' ') + isoTimes[i][0]; 2394 break; 2395 } 2396 } 2397 if (timeFormat == null) { 2398 config._isValid = false; 2399 return; 2400 } 2401 } 2402 if (!allowTime && timeFormat != null) { 2403 config._isValid = false; 2404 return; 2405 } 2406 if (match[4]) { 2407 if (tzRegex.exec(match[4])) { 2408 tzFormat = 'Z'; 2409 } else { 2410 config._isValid = false; 2411 return; 2412 } 2413 } 2414 config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); 2415 configFromStringAndFormat(config); 2416 } else { 2417 config._isValid = false; 2418 } 2419 } 2420 2421 function extractFromRFC2822Strings( 2422 yearStr, 2423 monthStr, 2424 dayStr, 2425 hourStr, 2426 minuteStr, 2427 secondStr 2428 ) { 2429 var result = [ 2430 untruncateYear(yearStr), 2431 defaultLocaleMonthsShort.indexOf(monthStr), 2432 parseInt(dayStr, 10), 2433 parseInt(hourStr, 10), 2434 parseInt(minuteStr, 10), 2435 ]; 2436 2437 if (secondStr) { 2438 result.push(parseInt(secondStr, 10)); 2439 } 2440 2441 return result; 2442 } 2443 2444 function untruncateYear(yearStr) { 2445 var year = parseInt(yearStr, 10); 2446 if (year <= 49) { 2447 return 2000 + year; 2448 } else if (year <= 999) { 2449 return 1900 + year; 2450 } 2451 return year; 2452 } 2453 2454 function preprocessRFC2822(s) { 2455 // Remove comments and folding whitespace and replace multiple-spaces with a single space 2456 return s 2457 .replace(/\([^)]*\)|[\n\t]/g, ' ') 2458 .replace(/(\s\s+)/g, ' ') 2459 .replace(/^\s\s*/, '') 2460 .replace(/\s\s*$/, ''); 2461 } 2462 2463 function checkWeekday(weekdayStr, parsedInput, config) { 2464 if (weekdayStr) { 2465 // TODO: Replace the vanilla JS Date object with an independent day-of-week check. 2466 var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), 2467 weekdayActual = new Date( 2468 parsedInput[0], 2469 parsedInput[1], 2470 parsedInput[2] 2471 ).getDay(); 2472 if (weekdayProvided !== weekdayActual) { 2473 getParsingFlags(config).weekdayMismatch = true; 2474 config._isValid = false; 2475 return false; 2476 } 2477 } 2478 return true; 2479 } 2480 2481 function calculateOffset(obsOffset, militaryOffset, numOffset) { 2482 if (obsOffset) { 2483 return obsOffsets[obsOffset]; 2484 } else if (militaryOffset) { 2485 // the only allowed military tz is Z 2486 return 0; 2487 } else { 2488 var hm = parseInt(numOffset, 10), 2489 m = hm % 100, 2490 h = (hm - m) / 100; 2491 return h * 60 + m; 2492 } 2493 } 2494 2495 // date and time from ref 2822 format 2496 function configFromRFC2822(config) { 2497 var match = rfc2822.exec(preprocessRFC2822(config._i)), 2498 parsedArray; 2499 if (match) { 2500 parsedArray = extractFromRFC2822Strings( 2501 match[4], 2502 match[3], 2503 match[2], 2504 match[5], 2505 match[6], 2506 match[7] 2507 ); 2508 if (!checkWeekday(match[1], parsedArray, config)) { 2509 return; 2510 } 2511 2512 config._a = parsedArray; 2513 config._tzm = calculateOffset(match[8], match[9], match[10]); 2514 2515 config._d = createUTCDate.apply(null, config._a); 2516 config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); 2517 2518 getParsingFlags(config).rfc2822 = true; 2519 } else { 2520 config._isValid = false; 2521 } 2522 } 2523 2524 // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict 2525 function configFromString(config) { 2526 var matched = aspNetJsonRegex.exec(config._i); 2527 if (matched !== null) { 2528 config._d = new Date(+matched[1]); 2529 return; 2530 } 2531 2532 configFromISO(config); 2533 if (config._isValid === false) { 2534 delete config._isValid; 2535 } else { 2536 return; 2537 } 2538 2539 configFromRFC2822(config); 2540 if (config._isValid === false) { 2541 delete config._isValid; 2542 } else { 2543 return; 2544 } 2545 2546 if (config._strict) { 2547 config._isValid = false; 2548 } else { 2549 // Final attempt, use Input Fallback 2550 hooks.createFromInputFallback(config); 2551 } 2552 } 2553 2554 hooks.createFromInputFallback = deprecate( 2555 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + 2556 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + 2557 'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.', 2558 function (config) { 2559 config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); 2560 } 2561 ); 2562 2563 // Pick the first defined of two or three arguments. 2564 function defaults(a, b, c) { 2565 if (a != null) { 2566 return a; 2567 } 2568 if (b != null) { 2569 return b; 2570 } 2571 return c; 2572 } 2573 2574 function currentDateArray(config) { 2575 // hooks is actually the exported moment object 2576 var nowValue = new Date(hooks.now()); 2577 if (config._useUTC) { 2578 return [ 2579 nowValue.getUTCFullYear(), 2580 nowValue.getUTCMonth(), 2581 nowValue.getUTCDate(), 2582 ]; 2583 } 2584 return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; 2585 } 2586 2587 // convert an array to a date. 2588 // the array should mirror the parameters below 2589 // note: all values past the year are optional and will default to the lowest possible value. 2590 // [year, month, day , hour, minute, second, millisecond] 2591 function configFromArray(config) { 2592 var i, 2593 date, 2594 input = [], 2595 currentDate, 2596 expectedWeekday, 2597 yearToUse; 2598 2599 if (config._d) { 2600 return; 2601 } 2602 2603 currentDate = currentDateArray(config); 2604 2605 //compute day of the year from weeks and weekdays 2606 if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { 2607 dayOfYearFromWeekInfo(config); 2608 } 2609 2610 //if the day of the year is set, figure out what it is 2611 if (config._dayOfYear != null) { 2612 yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); 2613 2614 if ( 2615 config._dayOfYear > daysInYear(yearToUse) || 2616 config._dayOfYear === 0 2617 ) { 2618 getParsingFlags(config)._overflowDayOfYear = true; 2619 } 2620 2621 date = createUTCDate(yearToUse, 0, config._dayOfYear); 2622 config._a[MONTH] = date.getUTCMonth(); 2623 config._a[DATE] = date.getUTCDate(); 2624 } 2625 2626 // Default to current date. 2627 // * if no year, month, day of month are given, default to today 2628 // * if day of month is given, default month and year 2629 // * if month is given, default only year 2630 // * if year is given, don't default anything 2631 for (i = 0; i < 3 && config._a[i] == null; ++i) { 2632 config._a[i] = input[i] = currentDate[i]; 2633 } 2634 2635 // Zero out whatever was not defaulted, including time 2636 for (; i < 7; i++) { 2637 config._a[i] = input[i] = 2638 config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i]; 2639 } 2640 2641 // Check for 24:00:00.000 2642 if ( 2643 config._a[HOUR] === 24 && 2644 config._a[MINUTE] === 0 && 2645 config._a[SECOND] === 0 && 2646 config._a[MILLISECOND] === 0 2647 ) { 2648 config._nextDay = true; 2649 config._a[HOUR] = 0; 2650 } 2651 2652 config._d = (config._useUTC ? createUTCDate : createDate).apply( 2653 null, 2654 input 2655 ); 2656 expectedWeekday = config._useUTC 2657 ? config._d.getUTCDay() 2658 : config._d.getDay(); 2659 2660 // Apply timezone offset from input. The actual utcOffset can be changed 2661 // with parseZone. 2662 if (config._tzm != null) { 2663 config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); 2664 } 2665 2666 if (config._nextDay) { 2667 config._a[HOUR] = 24; 2668 } 2669 2670 // check for mismatching day of week 2671 if ( 2672 config._w && 2673 typeof config._w.d !== 'undefined' && 2674 config._w.d !== expectedWeekday 2675 ) { 2676 getParsingFlags(config).weekdayMismatch = true; 2677 } 2678 } 2679 2680 function dayOfYearFromWeekInfo(config) { 2681 var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek; 2682 2683 w = config._w; 2684 if (w.GG != null || w.W != null || w.E != null) { 2685 dow = 1; 2686 doy = 4; 2687 2688 // TODO: We need to take the current isoWeekYear, but that depends on 2689 // how we interpret now (local, utc, fixed offset). So create 2690 // a now version of current config (take local/utc/offset flags, and 2691 // create now). 2692 weekYear = defaults( 2693 w.GG, 2694 config._a[YEAR], 2695 weekOfYear(createLocal(), 1, 4).year 2696 ); 2697 week = defaults(w.W, 1); 2698 weekday = defaults(w.E, 1); 2699 if (weekday < 1 || weekday > 7) { 2700 weekdayOverflow = true; 2701 } 2702 } else { 2703 dow = config._locale._week.dow; 2704 doy = config._locale._week.doy; 2705 2706 curWeek = weekOfYear(createLocal(), dow, doy); 2707 2708 weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); 2709 2710 // Default to current week. 2711 week = defaults(w.w, curWeek.week); 2712 2713 if (w.d != null) { 2714 // weekday -- low day numbers are considered next week 2715 weekday = w.d; 2716 if (weekday < 0 || weekday > 6) { 2717 weekdayOverflow = true; 2718 } 2719 } else if (w.e != null) { 2720 // local weekday -- counting starts from beginning of week 2721 weekday = w.e + dow; 2722 if (w.e < 0 || w.e > 6) { 2723 weekdayOverflow = true; 2724 } 2725 } else { 2726 // default to beginning of week 2727 weekday = dow; 2728 } 2729 } 2730 if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { 2731 getParsingFlags(config)._overflowWeeks = true; 2732 } else if (weekdayOverflow != null) { 2733 getParsingFlags(config)._overflowWeekday = true; 2734 } else { 2735 temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); 2736 config._a[YEAR] = temp.year; 2737 config._dayOfYear = temp.dayOfYear; 2738 } 2739 } 2740 2741 // constant that refers to the ISO standard 2742 hooks.ISO_8601 = function () {}; 2743 2744 // constant that refers to the RFC 2822 form 2745 hooks.RFC_2822 = function () {}; 2746 2747 // date from string and format string 2748 function configFromStringAndFormat(config) { 2749 // TODO: Move this to another part of the creation flow to prevent circular deps 2750 if (config._f === hooks.ISO_8601) { 2751 configFromISO(config); 2752 return; 2753 } 2754 if (config._f === hooks.RFC_2822) { 2755 configFromRFC2822(config); 2756 return; 2757 } 2758 config._a = []; 2759 getParsingFlags(config).empty = true; 2760 2761 // This array is used to make a Date, either with `new Date` or `Date.UTC` 2762 var string = '' + config._i, 2763 i, 2764 parsedInput, 2765 tokens, 2766 token, 2767 skipped, 2768 stringLength = string.length, 2769 totalParsedInputLength = 0, 2770 era, 2771 tokenLen; 2772 2773 tokens = 2774 expandFormat(config._f, config._locale).match(formattingTokens) || []; 2775 tokenLen = tokens.length; 2776 for (i = 0; i < tokenLen; i++) { 2777 token = tokens[i]; 2778 parsedInput = (string.match(getParseRegexForToken(token, config)) || 2779 [])[0]; 2780 if (parsedInput) { 2781 skipped = string.substr(0, string.indexOf(parsedInput)); 2782 if (skipped.length > 0) { 2783 getParsingFlags(config).unusedInput.push(skipped); 2784 } 2785 string = string.slice( 2786 string.indexOf(parsedInput) + parsedInput.length 2787 ); 2788 totalParsedInputLength += parsedInput.length; 2789 } 2790 // don't parse if it's not a known token 2791 if (formatTokenFunctions[token]) { 2792 if (parsedInput) { 2793 getParsingFlags(config).empty = false; 2794 } else { 2795 getParsingFlags(config).unusedTokens.push(token); 2796 } 2797 addTimeToArrayFromToken(token, parsedInput, config); 2798 } else if (config._strict && !parsedInput) { 2799 getParsingFlags(config).unusedTokens.push(token); 2800 } 2801 } 2802 2803 // add remaining unparsed input length to the string 2804 getParsingFlags(config).charsLeftOver = 2805 stringLength - totalParsedInputLength; 2806 if (string.length > 0) { 2807 getParsingFlags(config).unusedInput.push(string); 2808 } 2809 2810 // clear _12h flag if hour is <= 12 2811 if ( 2812 config._a[HOUR] <= 12 && 2813 getParsingFlags(config).bigHour === true && 2814 config._a[HOUR] > 0 2815 ) { 2816 getParsingFlags(config).bigHour = undefined; 2817 } 2818 2819 getParsingFlags(config).parsedDateParts = config._a.slice(0); 2820 getParsingFlags(config).meridiem = config._meridiem; 2821 // handle meridiem 2822 config._a[HOUR] = meridiemFixWrap( 2823 config._locale, 2824 config._a[HOUR], 2825 config._meridiem 2826 ); 2827 2828 // handle era 2829 era = getParsingFlags(config).era; 2830 if (era !== null) { 2831 config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]); 2832 } 2833 2834 configFromArray(config); 2835 checkOverflow(config); 2836 } 2837 2838 function meridiemFixWrap(locale, hour, meridiem) { 2839 var isPm; 2840 2841 if (meridiem == null) { 2842 // nothing to do 2843 return hour; 2844 } 2845 if (locale.meridiemHour != null) { 2846 return locale.meridiemHour(hour, meridiem); 2847 } else if (locale.isPM != null) { 2848 // Fallback 2849 isPm = locale.isPM(meridiem); 2850 if (isPm && hour < 12) { 2851 hour += 12; 2852 } 2853 if (!isPm && hour === 12) { 2854 hour = 0; 2855 } 2856 return hour; 2857 } else { 2858 // this is not supposed to happen 2859 return hour; 2860 } 2861 } 2862 2863 // date from string and array of format strings 2864 function configFromStringAndArray(config) { 2865 var tempConfig, 2866 bestMoment, 2867 scoreToBeat, 2868 i, 2869 currentScore, 2870 validFormatFound, 2871 bestFormatIsValid = false, 2872 configfLen = config._f.length; 2873 2874 if (configfLen === 0) { 2875 getParsingFlags(config).invalidFormat = true; 2876 config._d = new Date(NaN); 2877 return; 2878 } 2879 2880 for (i = 0; i < configfLen; i++) { 2881 currentScore = 0; 2882 validFormatFound = false; 2883 tempConfig = copyConfig({}, config); 2884 if (config._useUTC != null) { 2885 tempConfig._useUTC = config._useUTC; 2886 } 2887 tempConfig._f = config._f[i]; 2888 configFromStringAndFormat(tempConfig); 2889 2890 if (isValid(tempConfig)) { 2891 validFormatFound = true; 2892 } 2893 2894 // if there is any input that was not parsed add a penalty for that format 2895 currentScore += getParsingFlags(tempConfig).charsLeftOver; 2896 2897 //or tokens 2898 currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; 2899 2900 getParsingFlags(tempConfig).score = currentScore; 2901 2902 if (!bestFormatIsValid) { 2903 if ( 2904 scoreToBeat == null || 2905 currentScore < scoreToBeat || 2906 validFormatFound 2907 ) { 2908 scoreToBeat = currentScore; 2909 bestMoment = tempConfig; 2910 if (validFormatFound) { 2911 bestFormatIsValid = true; 2912 } 2913 } 2914 } else { 2915 if (currentScore < scoreToBeat) { 2916 scoreToBeat = currentScore; 2917 bestMoment = tempConfig; 2918 } 2919 } 2920 } 2921 2922 extend(config, bestMoment || tempConfig); 2923 } 2924 2925 function configFromObject(config) { 2926 if (config._d) { 2927 return; 2928 } 2929 2930 var i = normalizeObjectUnits(config._i), 2931 dayOrDate = i.day === undefined ? i.date : i.day; 2932 config._a = map( 2933 [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond], 2934 function (obj) { 2935 return obj && parseInt(obj, 10); 2936 } 2937 ); 2938 2939 configFromArray(config); 2940 } 2941 2942 function createFromConfig(config) { 2943 var res = new Moment(checkOverflow(prepareConfig(config))); 2944 if (res._nextDay) { 2945 // Adding is smart enough around DST 2946 res.add(1, 'd'); 2947 res._nextDay = undefined; 2948 } 2949 2950 return res; 2951 } 2952 2953 function prepareConfig(config) { 2954 var input = config._i, 2955 format = config._f; 2956 2957 config._locale = config._locale || getLocale(config._l); 2958 2959 if (input === null || (format === undefined && input === '')) { 2960 return createInvalid({ nullInput: true }); 2961 } 2962 2963 if (typeof input === 'string') { 2964 config._i = input = config._locale.preparse(input); 2965 } 2966 2967 if (isMoment(input)) { 2968 return new Moment(checkOverflow(input)); 2969 } else if (isDate(input)) { 2970 config._d = input; 2971 } else if (isArray(format)) { 2972 configFromStringAndArray(config); 2973 } else if (format) { 2974 configFromStringAndFormat(config); 2975 } else { 2976 configFromInput(config); 2977 } 2978 2979 if (!isValid(config)) { 2980 config._d = null; 2981 } 2982 2983 return config; 2984 } 2985 2986 function configFromInput(config) { 2987 var input = config._i; 2988 if (isUndefined(input)) { 2989 config._d = new Date(hooks.now()); 2990 } else if (isDate(input)) { 2991 config._d = new Date(input.valueOf()); 2992 } else if (typeof input === 'string') { 2993 configFromString(config); 2994 } else if (isArray(input)) { 2995 config._a = map(input.slice(0), function (obj) { 2996 return parseInt(obj, 10); 2997 }); 2998 configFromArray(config); 2999 } else if (isObject(input)) { 3000 configFromObject(config); 3001 } else if (isNumber(input)) { 3002 // from milliseconds 3003 config._d = new Date(input); 3004 } else { 3005 hooks.createFromInputFallback(config); 3006 } 3007 } 3008 3009 function createLocalOrUTC(input, format, locale, strict, isUTC) { 3010 var c = {}; 3011 3012 if (format === true || format === false) { 3013 strict = format; 3014 format = undefined; 3015 } 3016 3017 if (locale === true || locale === false) { 3018 strict = locale; 3019 locale = undefined; 3020 } 3021 3022 if ( 3023 (isObject(input) && isObjectEmpty(input)) || 3024 (isArray(input) && input.length === 0) 3025 ) { 3026 input = undefined; 3027 } 3028 // object construction must be done this way. 3029 // https://github.com/moment/moment/issues/1423 3030 c._isAMomentObject = true; 3031 c._useUTC = c._isUTC = isUTC; 3032 c._l = locale; 3033 c._i = input; 3034 c._f = format; 3035 c._strict = strict; 3036 3037 return createFromConfig(c); 3038 } 3039 3040 function createLocal(input, format, locale, strict) { 3041 return createLocalOrUTC(input, format, locale, strict, false); 3042 } 3043 3044 var prototypeMin = deprecate( 3045 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', 3046 function () { 3047 var other = createLocal.apply(null, arguments); 3048 if (this.isValid() && other.isValid()) { 3049 return other < this ? this : other; 3050 } else { 3051 return createInvalid(); 3052 } 3053 } 3054 ), 3055 prototypeMax = deprecate( 3056 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', 3057 function () { 3058 var other = createLocal.apply(null, arguments); 3059 if (this.isValid() && other.isValid()) { 3060 return other > this ? this : other; 3061 } else { 3062 return createInvalid(); 3063 } 3064 } 3065 ); 3066 3067 // Pick a moment m from moments so that m[fn](other) is true for all 3068 // other. This relies on the function fn to be transitive. 3069 // 3070 // moments should either be an array of moment objects or an array, whose 3071 // first element is an array of moment objects. 3072 function pickBy(fn, moments) { 3073 var res, i; 3074 if (moments.length === 1 && isArray(moments[0])) { 3075 moments = moments[0]; 3076 } 3077 if (!moments.length) { 3078 return createLocal(); 3079 } 3080 res = moments[0]; 3081 for (i = 1; i < moments.length; ++i) { 3082 if (!moments[i].isValid() || moments[i][fn](res)) { 3083 res = moments[i]; 3084 } 3085 } 3086 return res; 3087 } 3088 3089 // TODO: Use [].sort instead? 3090 function min() { 3091 var args = [].slice.call(arguments, 0); 3092 3093 return pickBy('isBefore', args); 3094 } 3095 3096 function max() { 3097 var args = [].slice.call(arguments, 0); 3098 3099 return pickBy('isAfter', args); 3100 } 3101 3102 var now = function () { 3103 return Date.now ? Date.now() : +new Date(); 3104 }; 3105 3106 var ordering = [ 3107 'year', 3108 'quarter', 3109 'month', 3110 'week', 3111 'day', 3112 'hour', 3113 'minute', 3114 'second', 3115 'millisecond', 3116 ]; 3117 3118 function isDurationValid(m) { 3119 var key, 3120 unitHasDecimal = false, 3121 i, 3122 orderLen = ordering.length; 3123 for (key in m) { 3124 if ( 3125 hasOwnProp(m, key) && 3126 !( 3127 indexOf.call(ordering, key) !== -1 && 3128 (m[key] == null || !isNaN(m[key])) 3129 ) 3130 ) { 3131 return false; 3132 } 3133 } 3134 3135 for (i = 0; i < orderLen; ++i) { 3136 if (m[ordering[i]]) { 3137 if (unitHasDecimal) { 3138 return false; // only allow non-integers for smallest unit 3139 } 3140 if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { 3141 unitHasDecimal = true; 3142 } 3143 } 3144 } 3145 3146 return true; 3147 } 3148 3149 function isValid$1() { 3150 return this._isValid; 3151 } 3152 3153 function createInvalid$1() { 3154 return createDuration(NaN); 3155 } 3156 3157 function Duration(duration) { 3158 var normalizedInput = normalizeObjectUnits(duration), 3159 years = normalizedInput.year || 0, 3160 quarters = normalizedInput.quarter || 0, 3161 months = normalizedInput.month || 0, 3162 weeks = normalizedInput.week || normalizedInput.isoWeek || 0, 3163 days = normalizedInput.day || 0, 3164 hours = normalizedInput.hour || 0, 3165 minutes = normalizedInput.minute || 0, 3166 seconds = normalizedInput.second || 0, 3167 milliseconds = normalizedInput.millisecond || 0; 3168 3169 this._isValid = isDurationValid(normalizedInput); 3170 3171 // representation for dateAddRemove 3172 this._milliseconds = 3173 +milliseconds + 3174 seconds * 1e3 + // 1000 3175 minutes * 6e4 + // 1000 * 60 3176 hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 3177 // Because of dateAddRemove treats 24 hours as different from a 3178 // day when working around DST, we need to store them separately 3179 this._days = +days + weeks * 7; 3180 // It is impossible to translate months into days without knowing 3181 // which months you are are talking about, so we have to store 3182 // it separately. 3183 this._months = +months + quarters * 3 + years * 12; 3184 3185 this._data = {}; 3186 3187 this._locale = getLocale(); 3188 3189 this._bubble(); 3190 } 3191 3192 function isDuration(obj) { 3193 return obj instanceof Duration; 3194 } 3195 3196 function absRound(number) { 3197 if (number < 0) { 3198 return Math.round(-1 * number) * -1; 3199 } else { 3200 return Math.round(number); 3201 } 3202 } 3203 3204 // compare two arrays, return the number of differences 3205 function compareArrays(array1, array2, dontConvert) { 3206 var len = Math.min(array1.length, array2.length), 3207 lengthDiff = Math.abs(array1.length - array2.length), 3208 diffs = 0, 3209 i; 3210 for (i = 0; i < len; i++) { 3211 if ( 3212 (dontConvert && array1[i] !== array2[i]) || 3213 (!dontConvert && toInt(array1[i]) !== toInt(array2[i])) 3214 ) { 3215 diffs++; 3216 } 3217 } 3218 return diffs + lengthDiff; 3219 } 3220 3221 // FORMATTING 3222 3223 function offset(token, separator) { 3224 addFormatToken(token, 0, 0, function () { 3225 var offset = this.utcOffset(), 3226 sign = '+'; 3227 if (offset < 0) { 3228 offset = -offset; 3229 sign = '-'; 3230 } 3231 return ( 3232 sign + 3233 zeroFill(~~(offset / 60), 2) + 3234 separator + 3235 zeroFill(~~offset % 60, 2) 3236 ); 3237 }); 3238 } 3239 3240 offset('Z', ':'); 3241 offset('ZZ', ''); 3242 3243 // PARSING 3244 3245 addRegexToken('Z', matchShortOffset); 3246 addRegexToken('ZZ', matchShortOffset); 3247 addParseToken(['Z', 'ZZ'], function (input, array, config) { 3248 config._useUTC = true; 3249 config._tzm = offsetFromString(matchShortOffset, input); 3250 }); 3251 3252 // HELPERS 3253 3254 // timezone chunker 3255 // '+10:00' > ['10', '00'] 3256 // '-1530' > ['-15', '30'] 3257 var chunkOffset = /([\+\-]|\d\d)/gi; 3258 3259 function offsetFromString(matcher, string) { 3260 var matches = (string || '').match(matcher), 3261 chunk, 3262 parts, 3263 minutes; 3264 3265 if (matches === null) { 3266 return null; 3267 } 3268 3269 chunk = matches[matches.length - 1] || []; 3270 parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; 3271 minutes = +(parts[1] * 60) + toInt(parts[2]); 3272 3273 return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes; 3274 } 3275 3276 // Return a moment from input, that is local/utc/zone equivalent to model. 3277 function cloneWithOffset(input, model) { 3278 var res, diff; 3279 if (model._isUTC) { 3280 res = model.clone(); 3281 diff = 3282 (isMoment(input) || isDate(input) 3283 ? input.valueOf() 3284 : createLocal(input).valueOf()) - res.valueOf(); 3285 // Use low-level api, because this fn is low-level api. 3286 res._d.setTime(res._d.valueOf() + diff); 3287 hooks.updateOffset(res, false); 3288 return res; 3289 } else { 3290 return createLocal(input).local(); 3291 } 3292 } 3293 3294 function getDateOffset(m) { 3295 // On Firefox.24 Date#getTimezoneOffset returns a floating point. 3296 // https://github.com/moment/moment/pull/1871 3297 return -Math.round(m._d.getTimezoneOffset()); 3298 } 3299 3300 // HOOKS 3301 3302 // This function will be called whenever a moment is mutated. 3303 // It is intended to keep the offset in sync with the timezone. 3304 hooks.updateOffset = function () {}; 3305 3306 // MOMENTS 3307 3308 // keepLocalTime = true means only change the timezone, without 3309 // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> 3310 // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset 3311 // +0200, so we adjust the time as needed, to be valid. 3312 // 3313 // Keeping the time actually adds/subtracts (one hour) 3314 // from the actual represented time. That is why we call updateOffset 3315 // a second time. In case it wants us to change the offset again 3316 // _changeInProgress == true case, then we have to adjust, because 3317 // there is no such time in the given timezone. 3318 function getSetOffset(input, keepLocalTime, keepMinutes) { 3319 var offset = this._offset || 0, 3320 localAdjust; 3321 if (!this.isValid()) { 3322 return input != null ? this : NaN; 3323 } 3324 if (input != null) { 3325 if (typeof input === 'string') { 3326 input = offsetFromString(matchShortOffset, input); 3327 if (input === null) { 3328 return this; 3329 } 3330 } else if (Math.abs(input) < 16 && !keepMinutes) { 3331 input = input * 60; 3332 } 3333 if (!this._isUTC && keepLocalTime) { 3334 localAdjust = getDateOffset(this); 3335 } 3336 this._offset = input; 3337 this._isUTC = true; 3338 if (localAdjust != null) { 3339 this.add(localAdjust, 'm'); 3340 } 3341 if (offset !== input) { 3342 if (!keepLocalTime || this._changeInProgress) { 3343 addSubtract( 3344 this, 3345 createDuration(input - offset, 'm'), 3346 1, 3347 false 3348 ); 3349 } else if (!this._changeInProgress) { 3350 this._changeInProgress = true; 3351 hooks.updateOffset(this, true); 3352 this._changeInProgress = null; 3353 } 3354 } 3355 return this; 3356 } else { 3357 return this._isUTC ? offset : getDateOffset(this); 3358 } 3359 } 3360 3361 function getSetZone(input, keepLocalTime) { 3362 if (input != null) { 3363 if (typeof input !== 'string') { 3364 input = -input; 3365 } 3366 3367 this.utcOffset(input, keepLocalTime); 3368 3369 return this; 3370 } else { 3371 return -this.utcOffset(); 3372 } 3373 } 3374 3375 function setOffsetToUTC(keepLocalTime) { 3376 return this.utcOffset(0, keepLocalTime); 3377 } 3378 3379 function setOffsetToLocal(keepLocalTime) { 3380 if (this._isUTC) { 3381 this.utcOffset(0, keepLocalTime); 3382 this._isUTC = false; 3383 3384 if (keepLocalTime) { 3385 this.subtract(getDateOffset(this), 'm'); 3386 } 3387 } 3388 return this; 3389 } 3390 3391 function setOffsetToParsedOffset() { 3392 if (this._tzm != null) { 3393 this.utcOffset(this._tzm, false, true); 3394 } else if (typeof this._i === 'string') { 3395 var tZone = offsetFromString(matchOffset, this._i); 3396 if (tZone != null) { 3397 this.utcOffset(tZone); 3398 } else { 3399 this.utcOffset(0, true); 3400 } 3401 } 3402 return this; 3403 } 3404 3405 function hasAlignedHourOffset(input) { 3406 if (!this.isValid()) { 3407 return false; 3408 } 3409 input = input ? createLocal(input).utcOffset() : 0; 3410 3411 return (this.utcOffset() - input) % 60 === 0; 3412 } 3413 3414 function isDaylightSavingTime() { 3415 return ( 3416 this.utcOffset() > this.clone().month(0).utcOffset() || 3417 this.utcOffset() > this.clone().month(5).utcOffset() 3418 ); 3419 } 3420 3421 function isDaylightSavingTimeShifted() { 3422 if (!isUndefined(this._isDSTShifted)) { 3423 return this._isDSTShifted; 3424 } 3425 3426 var c = {}, 3427 other; 3428 3429 copyConfig(c, this); 3430 c = prepareConfig(c); 3431 3432 if (c._a) { 3433 other = c._isUTC ? createUTC(c._a) : createLocal(c._a); 3434 this._isDSTShifted = 3435 this.isValid() && compareArrays(c._a, other.toArray()) > 0; 3436 } else { 3437 this._isDSTShifted = false; 3438 } 3439 3440 return this._isDSTShifted; 3441 } 3442 3443 function isLocal() { 3444 return this.isValid() ? !this._isUTC : false; 3445 } 3446 3447 function isUtcOffset() { 3448 return this.isValid() ? this._isUTC : false; 3449 } 3450 3451 function isUtc() { 3452 return this.isValid() ? this._isUTC && this._offset === 0 : false; 3453 } 3454 3455 // ASP.NET json date format regex 3456 var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/, 3457 // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html 3458 // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere 3459 // and further modified to allow for strings containing both week and day 3460 isoRegex = 3461 /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; 3462 3463 function createDuration(input, key) { 3464 var duration = input, 3465 // matching against regexp is expensive, do it on demand 3466 match = null, 3467 sign, 3468 ret, 3469 diffRes; 3470 3471 if (isDuration(input)) { 3472 duration = { 3473 ms: input._milliseconds, 3474 d: input._days, 3475 M: input._months, 3476 }; 3477 } else if (isNumber(input) || !isNaN(+input)) { 3478 duration = {}; 3479 if (key) { 3480 duration[key] = +input; 3481 } else { 3482 duration.milliseconds = +input; 3483 } 3484 } else if ((match = aspNetRegex.exec(input))) { 3485 sign = match[1] === '-' ? -1 : 1; 3486 duration = { 3487 y: 0, 3488 d: toInt(match[DATE]) * sign, 3489 h: toInt(match[HOUR]) * sign, 3490 m: toInt(match[MINUTE]) * sign, 3491 s: toInt(match[SECOND]) * sign, 3492 ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match 3493 }; 3494 } else if ((match = isoRegex.exec(input))) { 3495 sign = match[1] === '-' ? -1 : 1; 3496 duration = { 3497 y: parseIso(match[2], sign), 3498 M: parseIso(match[3], sign), 3499 w: parseIso(match[4], sign), 3500 d: parseIso(match[5], sign), 3501 h: parseIso(match[6], sign), 3502 m: parseIso(match[7], sign), 3503 s: parseIso(match[8], sign), 3504 }; 3505 } else if (duration == null) { 3506 // checks for null or undefined 3507 duration = {}; 3508 } else if ( 3509 typeof duration === 'object' && 3510 ('from' in duration || 'to' in duration) 3511 ) { 3512 diffRes = momentsDifference( 3513 createLocal(duration.from), 3514 createLocal(duration.to) 3515 ); 3516 3517 duration = {}; 3518 duration.ms = diffRes.milliseconds; 3519 duration.M = diffRes.months; 3520 } 3521 3522 ret = new Duration(duration); 3523 3524 if (isDuration(input) && hasOwnProp(input, '_locale')) { 3525 ret._locale = input._locale; 3526 } 3527 3528 if (isDuration(input) && hasOwnProp(input, '_isValid')) { 3529 ret._isValid = input._isValid; 3530 } 3531 3532 return ret; 3533 } 3534 3535 createDuration.fn = Duration.prototype; 3536 createDuration.invalid = createInvalid$1; 3537 3538 function parseIso(inp, sign) { 3539 // We'd normally use ~~inp for this, but unfortunately it also 3540 // converts floats to ints. 3541 // inp may be undefined, so careful calling replace on it. 3542 var res = inp && parseFloat(inp.replace(',', '.')); 3543 // apply sign while we're at it 3544 return (isNaN(res) ? 0 : res) * sign; 3545 } 3546 3547 function positiveMomentsDifference(base, other) { 3548 var res = {}; 3549 3550 res.months = 3551 other.month() - base.month() + (other.year() - base.year()) * 12; 3552 if (base.clone().add(res.months, 'M').isAfter(other)) { 3553 --res.months; 3554 } 3555 3556 res.milliseconds = +other - +base.clone().add(res.months, 'M'); 3557 3558 return res; 3559 } 3560 3561 function momentsDifference(base, other) { 3562 var res; 3563 if (!(base.isValid() && other.isValid())) { 3564 return { milliseconds: 0, months: 0 }; 3565 } 3566 3567 other = cloneWithOffset(other, base); 3568 if (base.isBefore(other)) { 3569 res = positiveMomentsDifference(base, other); 3570 } else { 3571 res = positiveMomentsDifference(other, base); 3572 res.milliseconds = -res.milliseconds; 3573 res.months = -res.months; 3574 } 3575 3576 return res; 3577 } 3578 3579 // TODO: remove 'name' arg after deprecation is removed 3580 function createAdder(direction, name) { 3581 return function (val, period) { 3582 var dur, tmp; 3583 //invert the arguments, but complain about it 3584 if (period !== null && !isNaN(+period)) { 3585 deprecateSimple( 3586 name, 3587 'moment().' + 3588 name + 3589 '(period, number) is deprecated. Please use moment().' + 3590 name + 3591 '(number, period). ' + 3592 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.' 3593 ); 3594 tmp = val; 3595 val = period; 3596 period = tmp; 3597 } 3598 3599 dur = createDuration(val, period); 3600 addSubtract(this, dur, direction); 3601 return this; 3602 }; 3603 } 3604 3605 function addSubtract(mom, duration, isAdding, updateOffset) { 3606 var milliseconds = duration._milliseconds, 3607 days = absRound(duration._days), 3608 months = absRound(duration._months); 3609 3610 if (!mom.isValid()) { 3611 // No op 3612 return; 3613 } 3614 3615 updateOffset = updateOffset == null ? true : updateOffset; 3616 3617 if (months) { 3618 setMonth(mom, get(mom, 'Month') + months * isAdding); 3619 } 3620 if (days) { 3621 set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); 3622 } 3623 if (milliseconds) { 3624 mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); 3625 } 3626 if (updateOffset) { 3627 hooks.updateOffset(mom, days || months); 3628 } 3629 } 3630 3631 var add = createAdder(1, 'add'), 3632 subtract = createAdder(-1, 'subtract'); 3633 3634 function isString(input) { 3635 return typeof input === 'string' || input instanceof String; 3636 } 3637 3638 // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined 3639 function isMomentInput(input) { 3640 return ( 3641 isMoment(input) || 3642 isDate(input) || 3643 isString(input) || 3644 isNumber(input) || 3645 isNumberOrStringArray(input) || 3646 isMomentInputObject(input) || 3647 input === null || 3648 input === undefined 3649 ); 3650 } 3651 3652 function isMomentInputObject(input) { 3653 var objectTest = isObject(input) && !isObjectEmpty(input), 3654 propertyTest = false, 3655 properties = [ 3656 'years', 3657 'year', 3658 'y', 3659 'months', 3660 'month', 3661 'M', 3662 'days', 3663 'day', 3664 'd', 3665 'dates', 3666 'date', 3667 'D', 3668 'hours', 3669 'hour', 3670 'h', 3671 'minutes', 3672 'minute', 3673 'm', 3674 'seconds', 3675 'second', 3676 's', 3677 'milliseconds', 3678 'millisecond', 3679 'ms', 3680 ], 3681 i, 3682 property, 3683 propertyLen = properties.length; 3684 3685 for (i = 0; i < propertyLen; i += 1) { 3686 property = properties[i]; 3687 propertyTest = propertyTest || hasOwnProp(input, property); 3688 } 3689 3690 return objectTest && propertyTest; 3691 } 3692 3693 function isNumberOrStringArray(input) { 3694 var arrayTest = isArray(input), 3695 dataTypeTest = false; 3696 if (arrayTest) { 3697 dataTypeTest = 3698 input.filter(function (item) { 3699 return !isNumber(item) && isString(input); 3700 }).length === 0; 3701 } 3702 return arrayTest && dataTypeTest; 3703 } 3704 3705 function isCalendarSpec(input) { 3706 var objectTest = isObject(input) && !isObjectEmpty(input), 3707 propertyTest = false, 3708 properties = [ 3709 'sameDay', 3710 'nextDay', 3711 'lastDay', 3712 'nextWeek', 3713 'lastWeek', 3714 'sameElse', 3715 ], 3716 i, 3717 property; 3718 3719 for (i = 0; i < properties.length; i += 1) { 3720 property = properties[i]; 3721 propertyTest = propertyTest || hasOwnProp(input, property); 3722 } 3723 3724 return objectTest && propertyTest; 3725 } 3726 3727 function getCalendarFormat(myMoment, now) { 3728 var diff = myMoment.diff(now, 'days', true); 3729 return diff < -6 3730 ? 'sameElse' 3731 : diff < -1 3732 ? 'lastWeek' 3733 : diff < 0 3734 ? 'lastDay' 3735 : diff < 1 3736 ? 'sameDay' 3737 : diff < 2 3738 ? 'nextDay' 3739 : diff < 7 3740 ? 'nextWeek' 3741 : 'sameElse'; 3742 } 3743 3744 function calendar$1(time, formats) { 3745 // Support for single parameter, formats only overload to the calendar function 3746 if (arguments.length === 1) { 3747 if (!arguments[0]) { 3748 time = undefined; 3749 formats = undefined; 3750 } else if (isMomentInput(arguments[0])) { 3751 time = arguments[0]; 3752 formats = undefined; 3753 } else if (isCalendarSpec(arguments[0])) { 3754 formats = arguments[0]; 3755 time = undefined; 3756 } 3757 } 3758 // We want to compare the start of today, vs this. 3759 // Getting start-of-today depends on whether we're local/utc/offset or not. 3760 var now = time || createLocal(), 3761 sod = cloneWithOffset(now, this).startOf('day'), 3762 format = hooks.calendarFormat(this, sod) || 'sameElse', 3763 output = 3764 formats && 3765 (isFunction(formats[format]) 3766 ? formats[format].call(this, now) 3767 : formats[format]); 3768 3769 return this.format( 3770 output || this.localeData().calendar(format, this, createLocal(now)) 3771 ); 3772 } 3773 3774 function clone() { 3775 return new Moment(this); 3776 } 3777 3778 function isAfter(input, units) { 3779 var localInput = isMoment(input) ? input : createLocal(input); 3780 if (!(this.isValid() && localInput.isValid())) { 3781 return false; 3782 } 3783 units = normalizeUnits(units) || 'millisecond'; 3784 if (units === 'millisecond') { 3785 return this.valueOf() > localInput.valueOf(); 3786 } else { 3787 return localInput.valueOf() < this.clone().startOf(units).valueOf(); 3788 } 3789 } 3790 3791 function isBefore(input, units) { 3792 var localInput = isMoment(input) ? input : createLocal(input); 3793 if (!(this.isValid() && localInput.isValid())) { 3794 return false; 3795 } 3796 units = normalizeUnits(units) || 'millisecond'; 3797 if (units === 'millisecond') { 3798 return this.valueOf() < localInput.valueOf(); 3799 } else { 3800 return this.clone().endOf(units).valueOf() < localInput.valueOf(); 3801 } 3802 } 3803 3804 function isBetween(from, to, units, inclusivity) { 3805 var localFrom = isMoment(from) ? from : createLocal(from), 3806 localTo = isMoment(to) ? to : createLocal(to); 3807 if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { 3808 return false; 3809 } 3810 inclusivity = inclusivity || '()'; 3811 return ( 3812 (inclusivity[0] === '(' 3813 ? this.isAfter(localFrom, units) 3814 : !this.isBefore(localFrom, units)) && 3815 (inclusivity[1] === ')' 3816 ? this.isBefore(localTo, units) 3817 : !this.isAfter(localTo, units)) 3818 ); 3819 } 3820 3821 function isSame(input, units) { 3822 var localInput = isMoment(input) ? input : createLocal(input), 3823 inputMs; 3824 if (!(this.isValid() && localInput.isValid())) { 3825 return false; 3826 } 3827 units = normalizeUnits(units) || 'millisecond'; 3828 if (units === 'millisecond') { 3829 return this.valueOf() === localInput.valueOf(); 3830 } else { 3831 inputMs = localInput.valueOf(); 3832 return ( 3833 this.clone().startOf(units).valueOf() <= inputMs && 3834 inputMs <= this.clone().endOf(units).valueOf() 3835 ); 3836 } 3837 } 3838 3839 function isSameOrAfter(input, units) { 3840 return this.isSame(input, units) || this.isAfter(input, units); 3841 } 3842 3843 function isSameOrBefore(input, units) { 3844 return this.isSame(input, units) || this.isBefore(input, units); 3845 } 3846 3847 function diff(input, units, asFloat) { 3848 var that, zoneDelta, output; 3849 3850 if (!this.isValid()) { 3851 return NaN; 3852 } 3853 3854 that = cloneWithOffset(input, this); 3855 3856 if (!that.isValid()) { 3857 return NaN; 3858 } 3859 3860 zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; 3861 3862 units = normalizeUnits(units); 3863 3864 switch (units) { 3865 case 'year': 3866 output = monthDiff(this, that) / 12; 3867 break; 3868 case 'month': 3869 output = monthDiff(this, that); 3870 break; 3871 case 'quarter': 3872 output = monthDiff(this, that) / 3; 3873 break; 3874 case 'second': 3875 output = (this - that) / 1e3; 3876 break; // 1000 3877 case 'minute': 3878 output = (this - that) / 6e4; 3879 break; // 1000 * 60 3880 case 'hour': 3881 output = (this - that) / 36e5; 3882 break; // 1000 * 60 * 60 3883 case 'day': 3884 output = (this - that - zoneDelta) / 864e5; 3885 break; // 1000 * 60 * 60 * 24, negate dst 3886 case 'week': 3887 output = (this - that - zoneDelta) / 6048e5; 3888 break; // 1000 * 60 * 60 * 24 * 7, negate dst 3889 default: 3890 output = this - that; 3891 } 3892 3893 return asFloat ? output : absFloor(output); 3894 } 3895 3896 function monthDiff(a, b) { 3897 if (a.date() < b.date()) { 3898 // end-of-month calculations work correct when the start month has more 3899 // days than the end month. 3900 return -monthDiff(b, a); 3901 } 3902 // difference in months 3903 var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()), 3904 // b is in (anchor - 1 month, anchor + 1 month) 3905 anchor = a.clone().add(wholeMonthDiff, 'months'), 3906 anchor2, 3907 adjust; 3908 3909 if (b - anchor < 0) { 3910 anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); 3911 // linear across the month 3912 adjust = (b - anchor) / (anchor - anchor2); 3913 } else { 3914 anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); 3915 // linear across the month 3916 adjust = (b - anchor) / (anchor2 - anchor); 3917 } 3918 3919 //check for negative zero, return zero if negative zero 3920 return -(wholeMonthDiff + adjust) || 0; 3921 } 3922 3923 hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; 3924 hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; 3925 3926 function toString() { 3927 return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); 3928 } 3929 3930 function toISOString(keepOffset) { 3931 if (!this.isValid()) { 3932 return null; 3933 } 3934 var utc = keepOffset !== true, 3935 m = utc ? this.clone().utc() : this; 3936 if (m.year() < 0 || m.year() > 9999) { 3937 return formatMoment( 3938 m, 3939 utc 3940 ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' 3941 : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ' 3942 ); 3943 } 3944 if (isFunction(Date.prototype.toISOString)) { 3945 // native implementation is ~50x faster, use it when we can 3946 if (utc) { 3947 return this.toDate().toISOString(); 3948 } else { 3949 return new Date(this.valueOf() + this.utcOffset() * 60 * 1000) 3950 .toISOString() 3951 .replace('Z', formatMoment(m, 'Z')); 3952 } 3953 } 3954 return formatMoment( 3955 m, 3956 utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ' 3957 ); 3958 } 3959 3960 /** 3961 * Return a human readable representation of a moment that can 3962 * also be evaluated to get a new moment which is the same 3963 * 3964 * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects 3965 */ 3966 function inspect() { 3967 if (!this.isValid()) { 3968 return 'moment.invalid(/* ' + this._i + ' */)'; 3969 } 3970 var func = 'moment', 3971 zone = '', 3972 prefix, 3973 year, 3974 datetime, 3975 suffix; 3976 if (!this.isLocal()) { 3977 func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; 3978 zone = 'Z'; 3979 } 3980 prefix = '[' + func + '("]'; 3981 year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY'; 3982 datetime = '-MM-DD[T]HH:mm:ss.SSS'; 3983 suffix = zone + '[")]'; 3984 3985 return this.format(prefix + year + datetime + suffix); 3986 } 3987 3988 function format(inputString) { 3989 if (!inputString) { 3990 inputString = this.isUtc() 3991 ? hooks.defaultFormatUtc 3992 : hooks.defaultFormat; 3993 } 3994 var output = formatMoment(this, inputString); 3995 return this.localeData().postformat(output); 3996 } 3997 3998 function from(time, withoutSuffix) { 3999 if ( 4000 this.isValid() && 4001 ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) 4002 ) { 4003 return createDuration({ to: this, from: time }) 4004 .locale(this.locale()) 4005 .humanize(!withoutSuffix); 4006 } else { 4007 return this.localeData().invalidDate(); 4008 } 4009 } 4010 4011 function fromNow(withoutSuffix) { 4012 return this.from(createLocal(), withoutSuffix); 4013 } 4014 4015 function to(time, withoutSuffix) { 4016 if ( 4017 this.isValid() && 4018 ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) 4019 ) { 4020 return createDuration({ from: this, to: time }) 4021 .locale(this.locale()) 4022 .humanize(!withoutSuffix); 4023 } else { 4024 return this.localeData().invalidDate(); 4025 } 4026 } 4027 4028 function toNow(withoutSuffix) { 4029 return this.to(createLocal(), withoutSuffix); 4030 } 4031 4032 // If passed a locale key, it will set the locale for this 4033 // instance. Otherwise, it will return the locale configuration 4034 // variables for this instance. 4035 function locale(key) { 4036 var newLocaleData; 4037 4038 if (key === undefined) { 4039 return this._locale._abbr; 4040 } else { 4041 newLocaleData = getLocale(key); 4042 if (newLocaleData != null) { 4043 this._locale = newLocaleData; 4044 } 4045 return this; 4046 } 4047 } 4048 4049 var lang = deprecate( 4050 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', 4051 function (key) { 4052 if (key === undefined) { 4053 return this.localeData(); 4054 } else { 4055 return this.locale(key); 4056 } 4057 } 4058 ); 4059 4060 function localeData() { 4061 return this._locale; 4062 } 4063 4064 var MS_PER_SECOND = 1000, 4065 MS_PER_MINUTE = 60 * MS_PER_SECOND, 4066 MS_PER_HOUR = 60 * MS_PER_MINUTE, 4067 MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; 4068 4069 // actual modulo - handles negative numbers (for dates before 1970): 4070 function mod$1(dividend, divisor) { 4071 return ((dividend % divisor) + divisor) % divisor; 4072 } 4073 4074 function localStartOfDate(y, m, d) { 4075 // the date constructor remaps years 0-99 to 1900-1999 4076 if (y < 100 && y >= 0) { 4077 // preserve leap years using a full 400 year cycle, then reset 4078 return new Date(y + 400, m, d) - MS_PER_400_YEARS; 4079 } else { 4080 return new Date(y, m, d).valueOf(); 4081 } 4082 } 4083 4084 function utcStartOfDate(y, m, d) { 4085 // Date.UTC remaps years 0-99 to 1900-1999 4086 if (y < 100 && y >= 0) { 4087 // preserve leap years using a full 400 year cycle, then reset 4088 return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; 4089 } else { 4090 return Date.UTC(y, m, d); 4091 } 4092 } 4093 4094 function startOf(units) { 4095 var time, startOfDate; 4096 units = normalizeUnits(units); 4097 if (units === undefined || units === 'millisecond' || !this.isValid()) { 4098 return this; 4099 } 4100 4101 startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; 4102 4103 switch (units) { 4104 case 'year': 4105 time = startOfDate(this.year(), 0, 1); 4106 break; 4107 case 'quarter': 4108 time = startOfDate( 4109 this.year(), 4110 this.month() - (this.month() % 3), 4111 1 4112 ); 4113 break; 4114 case 'month': 4115 time = startOfDate(this.year(), this.month(), 1); 4116 break; 4117 case 'week': 4118 time = startOfDate( 4119 this.year(), 4120 this.month(), 4121 this.date() - this.weekday() 4122 ); 4123 break; 4124 case 'isoWeek': 4125 time = startOfDate( 4126 this.year(), 4127 this.month(), 4128 this.date() - (this.isoWeekday() - 1) 4129 ); 4130 break; 4131 case 'day': 4132 case 'date': 4133 time = startOfDate(this.year(), this.month(), this.date()); 4134 break; 4135 case 'hour': 4136 time = this._d.valueOf(); 4137 time -= mod$1( 4138 time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), 4139 MS_PER_HOUR 4140 ); 4141 break; 4142 case 'minute': 4143 time = this._d.valueOf(); 4144 time -= mod$1(time, MS_PER_MINUTE); 4145 break; 4146 case 'second': 4147 time = this._d.valueOf(); 4148 time -= mod$1(time, MS_PER_SECOND); 4149 break; 4150 } 4151 4152 this._d.setTime(time); 4153 hooks.updateOffset(this, true); 4154 return this; 4155 } 4156 4157 function endOf(units) { 4158 var time, startOfDate; 4159 units = normalizeUnits(units); 4160 if (units === undefined || units === 'millisecond' || !this.isValid()) { 4161 return this; 4162 } 4163 4164 startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; 4165 4166 switch (units) { 4167 case 'year': 4168 time = startOfDate(this.year() + 1, 0, 1) - 1; 4169 break; 4170 case 'quarter': 4171 time = 4172 startOfDate( 4173 this.year(), 4174 this.month() - (this.month() % 3) + 3, 4175 1 4176 ) - 1; 4177 break; 4178 case 'month': 4179 time = startOfDate(this.year(), this.month() + 1, 1) - 1; 4180 break; 4181 case 'week': 4182 time = 4183 startOfDate( 4184 this.year(), 4185 this.month(), 4186 this.date() - this.weekday() + 7 4187 ) - 1; 4188 break; 4189 case 'isoWeek': 4190 time = 4191 startOfDate( 4192 this.year(), 4193 this.month(), 4194 this.date() - (this.isoWeekday() - 1) + 7 4195 ) - 1; 4196 break; 4197 case 'day': 4198 case 'date': 4199 time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; 4200 break; 4201 case 'hour': 4202 time = this._d.valueOf(); 4203 time += 4204 MS_PER_HOUR - 4205 mod$1( 4206 time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), 4207 MS_PER_HOUR 4208 ) - 4209 1; 4210 break; 4211 case 'minute': 4212 time = this._d.valueOf(); 4213 time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; 4214 break; 4215 case 'second': 4216 time = this._d.valueOf(); 4217 time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; 4218 break; 4219 } 4220 4221 this._d.setTime(time); 4222 hooks.updateOffset(this, true); 4223 return this; 4224 } 4225 4226 function valueOf() { 4227 return this._d.valueOf() - (this._offset || 0) * 60000; 4228 } 4229 4230 function unix() { 4231 return Math.floor(this.valueOf() / 1000); 4232 } 4233 4234 function toDate() { 4235 return new Date(this.valueOf()); 4236 } 4237 4238 function toArray() { 4239 var m = this; 4240 return [ 4241 m.year(), 4242 m.month(), 4243 m.date(), 4244 m.hour(), 4245 m.minute(), 4246 m.second(), 4247 m.millisecond(), 4248 ]; 4249 } 4250 4251 function toObject() { 4252 var m = this; 4253 return { 4254 years: m.year(), 4255 months: m.month(), 4256 date: m.date(), 4257 hours: m.hours(), 4258 minutes: m.minutes(), 4259 seconds: m.seconds(), 4260 milliseconds: m.milliseconds(), 4261 }; 4262 } 4263 4264 function toJSON() { 4265 // new Date(NaN).toJSON() === null 4266 return this.isValid() ? this.toISOString() : null; 4267 } 4268 4269 function isValid$2() { 4270 return isValid(this); 4271 } 4272 4273 function parsingFlags() { 4274 return extend({}, getParsingFlags(this)); 4275 } 4276 4277 function invalidAt() { 4278 return getParsingFlags(this).overflow; 4279 } 4280 4281 function creationData() { 4282 return { 4283 input: this._i, 4284 format: this._f, 4285 locale: this._locale, 4286 isUTC: this._isUTC, 4287 strict: this._strict, 4288 }; 4289 } 4290 4291 addFormatToken('N', 0, 0, 'eraAbbr'); 4292 addFormatToken('NN', 0, 0, 'eraAbbr'); 4293 addFormatToken('NNN', 0, 0, 'eraAbbr'); 4294 addFormatToken('NNNN', 0, 0, 'eraName'); 4295 addFormatToken('NNNNN', 0, 0, 'eraNarrow'); 4296 4297 addFormatToken('y', ['y', 1], 'yo', 'eraYear'); 4298 addFormatToken('y', ['yy', 2], 0, 'eraYear'); 4299 addFormatToken('y', ['yyy', 3], 0, 'eraYear'); 4300 addFormatToken('y', ['yyyy', 4], 0, 'eraYear'); 4301 4302 addRegexToken('N', matchEraAbbr); 4303 addRegexToken('NN', matchEraAbbr); 4304 addRegexToken('NNN', matchEraAbbr); 4305 addRegexToken('NNNN', matchEraName); 4306 addRegexToken('NNNNN', matchEraNarrow); 4307 4308 addParseToken( 4309 ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], 4310 function (input, array, config, token) { 4311 var era = config._locale.erasParse(input, token, config._strict); 4312 if (era) { 4313 getParsingFlags(config).era = era; 4314 } else { 4315 getParsingFlags(config).invalidEra = input; 4316 } 4317 } 4318 ); 4319 4320 addRegexToken('y', matchUnsigned); 4321 addRegexToken('yy', matchUnsigned); 4322 addRegexToken('yyy', matchUnsigned); 4323 addRegexToken('yyyy', matchUnsigned); 4324 addRegexToken('yo', matchEraYearOrdinal); 4325 4326 addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR); 4327 addParseToken(['yo'], function (input, array, config, token) { 4328 var match; 4329 if (config._locale._eraYearOrdinalRegex) { 4330 match = input.match(config._locale._eraYearOrdinalRegex); 4331 } 4332 4333 if (config._locale.eraYearOrdinalParse) { 4334 array[YEAR] = config._locale.eraYearOrdinalParse(input, match); 4335 } else { 4336 array[YEAR] = parseInt(input, 10); 4337 } 4338 }); 4339 4340 function localeEras(m, format) { 4341 var i, 4342 l, 4343 date, 4344 eras = this._eras || getLocale('en')._eras; 4345 for (i = 0, l = eras.length; i < l; ++i) { 4346 switch (typeof eras[i].since) { 4347 case 'string': 4348 // truncate time 4349 date = hooks(eras[i].since).startOf('day'); 4350 eras[i].since = date.valueOf(); 4351 break; 4352 } 4353 4354 switch (typeof eras[i].until) { 4355 case 'undefined': 4356 eras[i].until = +Infinity; 4357 break; 4358 case 'string': 4359 // truncate time 4360 date = hooks(eras[i].until).startOf('day').valueOf(); 4361 eras[i].until = date.valueOf(); 4362 break; 4363 } 4364 } 4365 return eras; 4366 } 4367 4368 function localeErasParse(eraName, format, strict) { 4369 var i, 4370 l, 4371 eras = this.eras(), 4372 name, 4373 abbr, 4374 narrow; 4375 eraName = eraName.toUpperCase(); 4376 4377 for (i = 0, l = eras.length; i < l; ++i) { 4378 name = eras[i].name.toUpperCase(); 4379 abbr = eras[i].abbr.toUpperCase(); 4380 narrow = eras[i].narrow.toUpperCase(); 4381 4382 if (strict) { 4383 switch (format) { 4384 case 'N': 4385 case 'NN': 4386 case 'NNN': 4387 if (abbr === eraName) { 4388 return eras[i]; 4389 } 4390 break; 4391 4392 case 'NNNN': 4393 if (name === eraName) { 4394 return eras[i]; 4395 } 4396 break; 4397 4398 case 'NNNNN': 4399 if (narrow === eraName) { 4400 return eras[i]; 4401 } 4402 break; 4403 } 4404 } else if ([name, abbr, narrow].indexOf(eraName) >= 0) { 4405 return eras[i]; 4406 } 4407 } 4408 } 4409 4410 function localeErasConvertYear(era, year) { 4411 var dir = era.since <= era.until ? +1 : -1; 4412 if (year === undefined) { 4413 return hooks(era.since).year(); 4414 } else { 4415 return hooks(era.since).year() + (year - era.offset) * dir; 4416 } 4417 } 4418 4419 function getEraName() { 4420 var i, 4421 l, 4422 val, 4423 eras = this.localeData().eras(); 4424 for (i = 0, l = eras.length; i < l; ++i) { 4425 // truncate time 4426 val = this.clone().startOf('day').valueOf(); 4427 4428 if (eras[i].since <= val && val <= eras[i].until) { 4429 return eras[i].name; 4430 } 4431 if (eras[i].until <= val && val <= eras[i].since) { 4432 return eras[i].name; 4433 } 4434 } 4435 4436 return ''; 4437 } 4438 4439 function getEraNarrow() { 4440 var i, 4441 l, 4442 val, 4443 eras = this.localeData().eras(); 4444 for (i = 0, l = eras.length; i < l; ++i) { 4445 // truncate time 4446 val = this.clone().startOf('day').valueOf(); 4447 4448 if (eras[i].since <= val && val <= eras[i].until) { 4449 return eras[i].narrow; 4450 } 4451 if (eras[i].until <= val && val <= eras[i].since) { 4452 return eras[i].narrow; 4453 } 4454 } 4455 4456 return ''; 4457 } 4458 4459 function getEraAbbr() { 4460 var i, 4461 l, 4462 val, 4463 eras = this.localeData().eras(); 4464 for (i = 0, l = eras.length; i < l; ++i) { 4465 // truncate time 4466 val = this.clone().startOf('day').valueOf(); 4467 4468 if (eras[i].since <= val && val <= eras[i].until) { 4469 return eras[i].abbr; 4470 } 4471 if (eras[i].until <= val && val <= eras[i].since) { 4472 return eras[i].abbr; 4473 } 4474 } 4475 4476 return ''; 4477 } 4478 4479 function getEraYear() { 4480 var i, 4481 l, 4482 dir, 4483 val, 4484 eras = this.localeData().eras(); 4485 for (i = 0, l = eras.length; i < l; ++i) { 4486 dir = eras[i].since <= eras[i].until ? +1 : -1; 4487 4488 // truncate time 4489 val = this.clone().startOf('day').valueOf(); 4490 4491 if ( 4492 (eras[i].since <= val && val <= eras[i].until) || 4493 (eras[i].until <= val && val <= eras[i].since) 4494 ) { 4495 return ( 4496 (this.year() - hooks(eras[i].since).year()) * dir + 4497 eras[i].offset 4498 ); 4499 } 4500 } 4501 4502 return this.year(); 4503 } 4504 4505 function erasNameRegex(isStrict) { 4506 if (!hasOwnProp(this, '_erasNameRegex')) { 4507 computeErasParse.call(this); 4508 } 4509 return isStrict ? this._erasNameRegex : this._erasRegex; 4510 } 4511 4512 function erasAbbrRegex(isStrict) { 4513 if (!hasOwnProp(this, '_erasAbbrRegex')) { 4514 computeErasParse.call(this); 4515 } 4516 return isStrict ? this._erasAbbrRegex : this._erasRegex; 4517 } 4518 4519 function erasNarrowRegex(isStrict) { 4520 if (!hasOwnProp(this, '_erasNarrowRegex')) { 4521 computeErasParse.call(this); 4522 } 4523 return isStrict ? this._erasNarrowRegex : this._erasRegex; 4524 } 4525 4526 function matchEraAbbr(isStrict, locale) { 4527 return locale.erasAbbrRegex(isStrict); 4528 } 4529 4530 function matchEraName(isStrict, locale) { 4531 return locale.erasNameRegex(isStrict); 4532 } 4533 4534 function matchEraNarrow(isStrict, locale) { 4535 return locale.erasNarrowRegex(isStrict); 4536 } 4537 4538 function matchEraYearOrdinal(isStrict, locale) { 4539 return locale._eraYearOrdinalRegex || matchUnsigned; 4540 } 4541 4542 function computeErasParse() { 4543 var abbrPieces = [], 4544 namePieces = [], 4545 narrowPieces = [], 4546 mixedPieces = [], 4547 i, 4548 l, 4549 eras = this.eras(); 4550 4551 for (i = 0, l = eras.length; i < l; ++i) { 4552 namePieces.push(regexEscape(eras[i].name)); 4553 abbrPieces.push(regexEscape(eras[i].abbr)); 4554 narrowPieces.push(regexEscape(eras[i].narrow)); 4555 4556 mixedPieces.push(regexEscape(eras[i].name)); 4557 mixedPieces.push(regexEscape(eras[i].abbr)); 4558 mixedPieces.push(regexEscape(eras[i].narrow)); 4559 } 4560 4561 this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); 4562 this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i'); 4563 this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i'); 4564 this._erasNarrowRegex = new RegExp( 4565 '^(' + narrowPieces.join('|') + ')', 4566 'i' 4567 ); 4568 } 4569 4570 // FORMATTING 4571 4572 addFormatToken(0, ['gg', 2], 0, function () { 4573 return this.weekYear() % 100; 4574 }); 4575 4576 addFormatToken(0, ['GG', 2], 0, function () { 4577 return this.isoWeekYear() % 100; 4578 }); 4579 4580 function addWeekYearFormatToken(token, getter) { 4581 addFormatToken(0, [token, token.length], 0, getter); 4582 } 4583 4584 addWeekYearFormatToken('gggg', 'weekYear'); 4585 addWeekYearFormatToken('ggggg', 'weekYear'); 4586 addWeekYearFormatToken('GGGG', 'isoWeekYear'); 4587 addWeekYearFormatToken('GGGGG', 'isoWeekYear'); 4588 4589 // ALIASES 4590 4591 addUnitAlias('weekYear', 'gg'); 4592 addUnitAlias('isoWeekYear', 'GG'); 4593 4594 // PRIORITY 4595 4596 addUnitPriority('weekYear', 1); 4597 addUnitPriority('isoWeekYear', 1); 4598 4599 // PARSING 4600 4601 addRegexToken('G', matchSigned); 4602 addRegexToken('g', matchSigned); 4603 addRegexToken('GG', match1to2, match2); 4604 addRegexToken('gg', match1to2, match2); 4605 addRegexToken('GGGG', match1to4, match4); 4606 addRegexToken('gggg', match1to4, match4); 4607 addRegexToken('GGGGG', match1to6, match6); 4608 addRegexToken('ggggg', match1to6, match6); 4609 4610 addWeekParseToken( 4611 ['gggg', 'ggggg', 'GGGG', 'GGGGG'], 4612 function (input, week, config, token) { 4613 week[token.substr(0, 2)] = toInt(input); 4614 } 4615 ); 4616 4617 addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { 4618 week[token] = hooks.parseTwoDigitYear(input); 4619 }); 4620 4621 // MOMENTS 4622 4623 function getSetWeekYear(input) { 4624 return getSetWeekYearHelper.call( 4625 this, 4626 input, 4627 this.week(), 4628 this.weekday(), 4629 this.localeData()._week.dow, 4630 this.localeData()._week.doy 4631 ); 4632 } 4633 4634 function getSetISOWeekYear(input) { 4635 return getSetWeekYearHelper.call( 4636 this, 4637 input, 4638 this.isoWeek(), 4639 this.isoWeekday(), 4640 1, 4641 4 4642 ); 4643 } 4644 4645 function getISOWeeksInYear() { 4646 return weeksInYear(this.year(), 1, 4); 4647 } 4648 4649 function getISOWeeksInISOWeekYear() { 4650 return weeksInYear(this.isoWeekYear(), 1, 4); 4651 } 4652 4653 function getWeeksInYear() { 4654 var weekInfo = this.localeData()._week; 4655 return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); 4656 } 4657 4658 function getWeeksInWeekYear() { 4659 var weekInfo = this.localeData()._week; 4660 return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy); 4661 } 4662 4663 function getSetWeekYearHelper(input, week, weekday, dow, doy) { 4664 var weeksTarget; 4665 if (input == null) { 4666 return weekOfYear(this, dow, doy).year; 4667 } else { 4668 weeksTarget = weeksInYear(input, dow, doy); 4669 if (week > weeksTarget) { 4670 week = weeksTarget; 4671 } 4672 return setWeekAll.call(this, input, week, weekday, dow, doy); 4673 } 4674 } 4675 4676 function setWeekAll(weekYear, week, weekday, dow, doy) { 4677 var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), 4678 date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); 4679 4680 this.year(date.getUTCFullYear()); 4681 this.month(date.getUTCMonth()); 4682 this.date(date.getUTCDate()); 4683 return this; 4684 } 4685 4686 // FORMATTING 4687 4688 addFormatToken('Q', 0, 'Qo', 'quarter'); 4689 4690 // ALIASES 4691 4692 addUnitAlias('quarter', 'Q'); 4693 4694 // PRIORITY 4695 4696 addUnitPriority('quarter', 7); 4697 4698 // PARSING 4699 4700 addRegexToken('Q', match1); 4701 addParseToken('Q', function (input, array) { 4702 array[MONTH] = (toInt(input) - 1) * 3; 4703 }); 4704 4705 // MOMENTS 4706 4707 function getSetQuarter(input) { 4708 return input == null 4709 ? Math.ceil((this.month() + 1) / 3) 4710 : this.month((input - 1) * 3 + (this.month() % 3)); 4711 } 4712 4713 // FORMATTING 4714 4715 addFormatToken('D', ['DD', 2], 'Do', 'date'); 4716 4717 // ALIASES 4718 4719 addUnitAlias('date', 'D'); 4720 4721 // PRIORITY 4722 addUnitPriority('date', 9); 4723 4724 // PARSING 4725 4726 addRegexToken('D', match1to2); 4727 addRegexToken('DD', match1to2, match2); 4728 addRegexToken('Do', function (isStrict, locale) { 4729 // TODO: Remove "ordinalParse" fallback in next major release. 4730 return isStrict 4731 ? locale._dayOfMonthOrdinalParse || locale._ordinalParse 4732 : locale._dayOfMonthOrdinalParseLenient; 4733 }); 4734 4735 addParseToken(['D', 'DD'], DATE); 4736 addParseToken('Do', function (input, array) { 4737 array[DATE] = toInt(input.match(match1to2)[0]); 4738 }); 4739 4740 // MOMENTS 4741 4742 var getSetDayOfMonth = makeGetSet('Date', true); 4743 4744 // FORMATTING 4745 4746 addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); 4747 4748 // ALIASES 4749 4750 addUnitAlias('dayOfYear', 'DDD'); 4751 4752 // PRIORITY 4753 addUnitPriority('dayOfYear', 4); 4754 4755 // PARSING 4756 4757 addRegexToken('DDD', match1to3); 4758 addRegexToken('DDDD', match3); 4759 addParseToken(['DDD', 'DDDD'], function (input, array, config) { 4760 config._dayOfYear = toInt(input); 4761 }); 4762 4763 // HELPERS 4764 4765 // MOMENTS 4766 4767 function getSetDayOfYear(input) { 4768 var dayOfYear = 4769 Math.round( 4770 (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5 4771 ) + 1; 4772 return input == null ? dayOfYear : this.add(input - dayOfYear, 'd'); 4773 } 4774 4775 // FORMATTING 4776 4777 addFormatToken('m', ['mm', 2], 0, 'minute'); 4778 4779 // ALIASES 4780 4781 addUnitAlias('minute', 'm'); 4782 4783 // PRIORITY 4784 4785 addUnitPriority('minute', 14); 4786 4787 // PARSING 4788 4789 addRegexToken('m', match1to2); 4790 addRegexToken('mm', match1to2, match2); 4791 addParseToken(['m', 'mm'], MINUTE); 4792 4793 // MOMENTS 4794 4795 var getSetMinute = makeGetSet('Minutes', false); 4796 4797 // FORMATTING 4798 4799 addFormatToken('s', ['ss', 2], 0, 'second'); 4800 4801 // ALIASES 4802 4803 addUnitAlias('second', 's'); 4804 4805 // PRIORITY 4806 4807 addUnitPriority('second', 15); 4808 4809 // PARSING 4810 4811 addRegexToken('s', match1to2); 4812 addRegexToken('ss', match1to2, match2); 4813 addParseToken(['s', 'ss'], SECOND); 4814 4815 // MOMENTS 4816 4817 var getSetSecond = makeGetSet('Seconds', false); 4818 4819 // FORMATTING 4820 4821 addFormatToken('S', 0, 0, function () { 4822 return ~~(this.millisecond() / 100); 4823 }); 4824 4825 addFormatToken(0, ['SS', 2], 0, function () { 4826 return ~~(this.millisecond() / 10); 4827 }); 4828 4829 addFormatToken(0, ['SSS', 3], 0, 'millisecond'); 4830 addFormatToken(0, ['SSSS', 4], 0, function () { 4831 return this.millisecond() * 10; 4832 }); 4833 addFormatToken(0, ['SSSSS', 5], 0, function () { 4834 return this.millisecond() * 100; 4835 }); 4836 addFormatToken(0, ['SSSSSS', 6], 0, function () { 4837 return this.millisecond() * 1000; 4838 }); 4839 addFormatToken(0, ['SSSSSSS', 7], 0, function () { 4840 return this.millisecond() * 10000; 4841 }); 4842 addFormatToken(0, ['SSSSSSSS', 8], 0, function () { 4843 return this.millisecond() * 100000; 4844 }); 4845 addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { 4846 return this.millisecond() * 1000000; 4847 }); 4848 4849 // ALIASES 4850 4851 addUnitAlias('millisecond', 'ms'); 4852 4853 // PRIORITY 4854 4855 addUnitPriority('millisecond', 16); 4856 4857 // PARSING 4858 4859 addRegexToken('S', match1to3, match1); 4860 addRegexToken('SS', match1to3, match2); 4861 addRegexToken('SSS', match1to3, match3); 4862 4863 var token, getSetMillisecond; 4864 for (token = 'SSSS'; token.length <= 9; token += 'S') { 4865 addRegexToken(token, matchUnsigned); 4866 } 4867 4868 function parseMs(input, array) { 4869 array[MILLISECOND] = toInt(('0.' + input) * 1000); 4870 } 4871 4872 for (token = 'S'; token.length <= 9; token += 'S') { 4873 addParseToken(token, parseMs); 4874 } 4875 4876 getSetMillisecond = makeGetSet('Milliseconds', false); 4877 4878 // FORMATTING 4879 4880 addFormatToken('z', 0, 0, 'zoneAbbr'); 4881 addFormatToken('zz', 0, 0, 'zoneName'); 4882 4883 // MOMENTS 4884 4885 function getZoneAbbr() { 4886 return this._isUTC ? 'UTC' : ''; 4887 } 4888 4889 function getZoneName() { 4890 return this._isUTC ? 'Coordinated Universal Time' : ''; 4891 } 4892 4893 var proto = Moment.prototype; 4894 4895 proto.add = add; 4896 proto.calendar = calendar$1; 4897 proto.clone = clone; 4898 proto.diff = diff; 4899 proto.endOf = endOf; 4900 proto.format = format; 4901 proto.from = from; 4902 proto.fromNow = fromNow; 4903 proto.to = to; 4904 proto.toNow = toNow; 4905 proto.get = stringGet; 4906 proto.invalidAt = invalidAt; 4907 proto.isAfter = isAfter; 4908 proto.isBefore = isBefore; 4909 proto.isBetween = isBetween; 4910 proto.isSame = isSame; 4911 proto.isSameOrAfter = isSameOrAfter; 4912 proto.isSameOrBefore = isSameOrBefore; 4913 proto.isValid = isValid$2; 4914 proto.lang = lang; 4915 proto.locale = locale; 4916 proto.localeData = localeData; 4917 proto.max = prototypeMax; 4918 proto.min = prototypeMin; 4919 proto.parsingFlags = parsingFlags; 4920 proto.set = stringSet; 4921 proto.startOf = startOf; 4922 proto.subtract = subtract; 4923 proto.toArray = toArray; 4924 proto.toObject = toObject; 4925 proto.toDate = toDate; 4926 proto.toISOString = toISOString; 4927 proto.inspect = inspect; 4928 if (typeof Symbol !== 'undefined' && Symbol.for != null) { 4929 proto[Symbol.for('nodejs.util.inspect.custom')] = function () { 4930 return 'Moment<' + this.format() + '>'; 4931 }; 4932 } 4933 proto.toJSON = toJSON; 4934 proto.toString = toString; 4935 proto.unix = unix; 4936 proto.valueOf = valueOf; 4937 proto.creationData = creationData; 4938 proto.eraName = getEraName; 4939 proto.eraNarrow = getEraNarrow; 4940 proto.eraAbbr = getEraAbbr; 4941 proto.eraYear = getEraYear; 4942 proto.year = getSetYear; 4943 proto.isLeapYear = getIsLeapYear; 4944 proto.weekYear = getSetWeekYear; 4945 proto.isoWeekYear = getSetISOWeekYear; 4946 proto.quarter = proto.quarters = getSetQuarter; 4947 proto.month = getSetMonth; 4948 proto.daysInMonth = getDaysInMonth; 4949 proto.week = proto.weeks = getSetWeek; 4950 proto.isoWeek = proto.isoWeeks = getSetISOWeek; 4951 proto.weeksInYear = getWeeksInYear; 4952 proto.weeksInWeekYear = getWeeksInWeekYear; 4953 proto.isoWeeksInYear = getISOWeeksInYear; 4954 proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear; 4955 proto.date = getSetDayOfMonth; 4956 proto.day = proto.days = getSetDayOfWeek; 4957 proto.weekday = getSetLocaleDayOfWeek; 4958 proto.isoWeekday = getSetISODayOfWeek; 4959 proto.dayOfYear = getSetDayOfYear; 4960 proto.hour = proto.hours = getSetHour; 4961 proto.minute = proto.minutes = getSetMinute; 4962 proto.second = proto.seconds = getSetSecond; 4963 proto.millisecond = proto.milliseconds = getSetMillisecond; 4964 proto.utcOffset = getSetOffset; 4965 proto.utc = setOffsetToUTC; 4966 proto.local = setOffsetToLocal; 4967 proto.parseZone = setOffsetToParsedOffset; 4968 proto.hasAlignedHourOffset = hasAlignedHourOffset; 4969 proto.isDST = isDaylightSavingTime; 4970 proto.isLocal = isLocal; 4971 proto.isUtcOffset = isUtcOffset; 4972 proto.isUtc = isUtc; 4973 proto.isUTC = isUtc; 4974 proto.zoneAbbr = getZoneAbbr; 4975 proto.zoneName = getZoneName; 4976 proto.dates = deprecate( 4977 'dates accessor is deprecated. Use date instead.', 4978 getSetDayOfMonth 4979 ); 4980 proto.months = deprecate( 4981 'months accessor is deprecated. Use month instead', 4982 getSetMonth 4983 ); 4984 proto.years = deprecate( 4985 'years accessor is deprecated. Use year instead', 4986 getSetYear 4987 ); 4988 proto.zone = deprecate( 4989 'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', 4990 getSetZone 4991 ); 4992 proto.isDSTShifted = deprecate( 4993 'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', 4994 isDaylightSavingTimeShifted 4995 ); 4996 4997 function createUnix(input) { 4998 return createLocal(input * 1000); 4999 } 5000 5001 function createInZone() { 5002 return createLocal.apply(null, arguments).parseZone(); 5003 } 5004 5005 function preParsePostFormat(string) { 5006 return string; 5007 } 5008 5009 var proto$1 = Locale.prototype; 5010 5011 proto$1.calendar = calendar; 5012 proto$1.longDateFormat = longDateFormat; 5013 proto$1.invalidDate = invalidDate; 5014 proto$1.ordinal = ordinal; 5015 proto$1.preparse = preParsePostFormat; 5016 proto$1.postformat = preParsePostFormat; 5017 proto$1.relativeTime = relativeTime; 5018 proto$1.pastFuture = pastFuture; 5019 proto$1.set = set; 5020 proto$1.eras = localeEras; 5021 proto$1.erasParse = localeErasParse; 5022 proto$1.erasConvertYear = localeErasConvertYear; 5023 proto$1.erasAbbrRegex = erasAbbrRegex; 5024 proto$1.erasNameRegex = erasNameRegex; 5025 proto$1.erasNarrowRegex = erasNarrowRegex; 5026 5027 proto$1.months = localeMonths; 5028 proto$1.monthsShort = localeMonthsShort; 5029 proto$1.monthsParse = localeMonthsParse; 5030 proto$1.monthsRegex = monthsRegex; 5031 proto$1.monthsShortRegex = monthsShortRegex; 5032 proto$1.week = localeWeek; 5033 proto$1.firstDayOfYear = localeFirstDayOfYear; 5034 proto$1.firstDayOfWeek = localeFirstDayOfWeek; 5035 5036 proto$1.weekdays = localeWeekdays; 5037 proto$1.weekdaysMin = localeWeekdaysMin; 5038 proto$1.weekdaysShort = localeWeekdaysShort; 5039 proto$1.weekdaysParse = localeWeekdaysParse; 5040 5041 proto$1.weekdaysRegex = weekdaysRegex; 5042 proto$1.weekdaysShortRegex = weekdaysShortRegex; 5043 proto$1.weekdaysMinRegex = weekdaysMinRegex; 5044 5045 proto$1.isPM = localeIsPM; 5046 proto$1.meridiem = localeMeridiem; 5047 5048 function get$1(format, index, field, setter) { 5049 var locale = getLocale(), 5050 utc = createUTC().set(setter, index); 5051 return locale[field](utc, format); 5052 } 5053 5054 function listMonthsImpl(format, index, field) { 5055 if (isNumber(format)) { 5056 index = format; 5057 format = undefined; 5058 } 5059 5060 format = format || ''; 5061 5062 if (index != null) { 5063 return get$1(format, index, field, 'month'); 5064 } 5065 5066 var i, 5067 out = []; 5068 for (i = 0; i < 12; i++) { 5069 out[i] = get$1(format, i, field, 'month'); 5070 } 5071 return out; 5072 } 5073 5074 // () 5075 // (5) 5076 // (fmt, 5) 5077 // (fmt) 5078 // (true) 5079 // (true, 5) 5080 // (true, fmt, 5) 5081 // (true, fmt) 5082 function listWeekdaysImpl(localeSorted, format, index, field) { 5083 if (typeof localeSorted === 'boolean') { 5084 if (isNumber(format)) { 5085 index = format; 5086 format = undefined; 5087 } 5088 5089 format = format || ''; 5090 } else { 5091 format = localeSorted; 5092 index = format; 5093 localeSorted = false; 5094 5095 if (isNumber(format)) { 5096 index = format; 5097 format = undefined; 5098 } 5099 5100 format = format || ''; 5101 } 5102 5103 var locale = getLocale(), 5104 shift = localeSorted ? locale._week.dow : 0, 5105 i, 5106 out = []; 5107 5108 if (index != null) { 5109 return get$1(format, (index + shift) % 7, field, 'day'); 5110 } 5111 5112 for (i = 0; i < 7; i++) { 5113 out[i] = get$1(format, (i + shift) % 7, field, 'day'); 5114 } 5115 return out; 5116 } 5117 5118 function listMonths(format, index) { 5119 return listMonthsImpl(format, index, 'months'); 5120 } 5121 5122 function listMonthsShort(format, index) { 5123 return listMonthsImpl(format, index, 'monthsShort'); 5124 } 5125 5126 function listWeekdays(localeSorted, format, index) { 5127 return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); 5128 } 5129 5130 function listWeekdaysShort(localeSorted, format, index) { 5131 return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); 5132 } 5133 5134 function listWeekdaysMin(localeSorted, format, index) { 5135 return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); 5136 } 5137 5138 getSetGlobalLocale('en', { 5139 eras: [ 5140 { 5141 since: '0001-01-01', 5142 until: +Infinity, 5143 offset: 1, 5144 name: 'Anno Domini', 5145 narrow: 'AD', 5146 abbr: 'AD', 5147 }, 5148 { 5149 since: '0000-12-31', 5150 until: -Infinity, 5151 offset: 1, 5152 name: 'Before Christ', 5153 narrow: 'BC', 5154 abbr: 'BC', 5155 }, 5156 ], 5157 dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, 5158 ordinal: function (number) { 5159 var b = number % 10, 5160 output = 5161 toInt((number % 100) / 10) === 1 5162 ? 'th' 5163 : b === 1 5164 ? 'st' 5165 : b === 2 5166 ? 'nd' 5167 : b === 3 5168 ? 'rd' 5169 : 'th'; 5170 return number + output; 5171 }, 5172 }); 5173 5174 // Side effect imports 5175 5176 hooks.lang = deprecate( 5177 'moment.lang is deprecated. Use moment.locale instead.', 5178 getSetGlobalLocale 5179 ); 5180 hooks.langData = deprecate( 5181 'moment.langData is deprecated. Use moment.localeData instead.', 5182 getLocale 5183 ); 5184 5185 var mathAbs = Math.abs; 5186 5187 function abs() { 5188 var data = this._data; 5189 5190 this._milliseconds = mathAbs(this._milliseconds); 5191 this._days = mathAbs(this._days); 5192 this._months = mathAbs(this._months); 5193 5194 data.milliseconds = mathAbs(data.milliseconds); 5195 data.seconds = mathAbs(data.seconds); 5196 data.minutes = mathAbs(data.minutes); 5197 data.hours = mathAbs(data.hours); 5198 data.months = mathAbs(data.months); 5199 data.years = mathAbs(data.years); 5200 5201 return this; 5202 } 5203 5204 function addSubtract$1(duration, input, value, direction) { 5205 var other = createDuration(input, value); 5206 5207 duration._milliseconds += direction * other._milliseconds; 5208 duration._days += direction * other._days; 5209 duration._months += direction * other._months; 5210 5211 return duration._bubble(); 5212 } 5213 5214 // supports only 2.0-style add(1, 's') or add(duration) 5215 function add$1(input, value) { 5216 return addSubtract$1(this, input, value, 1); 5217 } 5218 5219 // supports only 2.0-style subtract(1, 's') or subtract(duration) 5220 function subtract$1(input, value) { 5221 return addSubtract$1(this, input, value, -1); 5222 } 5223 5224 function absCeil(number) { 5225 if (number < 0) { 5226 return Math.floor(number); 5227 } else { 5228 return Math.ceil(number); 5229 } 5230 } 5231 5232 function bubble() { 5233 var milliseconds = this._milliseconds, 5234 days = this._days, 5235 months = this._months, 5236 data = this._data, 5237 seconds, 5238 minutes, 5239 hours, 5240 years, 5241 monthsFromDays; 5242 5243 // if we have a mix of positive and negative values, bubble down first 5244 // check: https://github.com/moment/moment/issues/2166 5245 if ( 5246 !( 5247 (milliseconds >= 0 && days >= 0 && months >= 0) || 5248 (milliseconds <= 0 && days <= 0 && months <= 0) 5249 ) 5250 ) { 5251 milliseconds += absCeil(monthsToDays(months) + days) * 864e5; 5252 days = 0; 5253 months = 0; 5254 } 5255 5256 // The following code bubbles up values, see the tests for 5257 // examples of what that means. 5258 data.milliseconds = milliseconds % 1000; 5259 5260 seconds = absFloor(milliseconds / 1000); 5261 data.seconds = seconds % 60; 5262 5263 minutes = absFloor(seconds / 60); 5264 data.minutes = minutes % 60; 5265 5266 hours = absFloor(minutes / 60); 5267 data.hours = hours % 24; 5268 5269 days += absFloor(hours / 24); 5270 5271 // convert days to months 5272 monthsFromDays = absFloor(daysToMonths(days)); 5273 months += monthsFromDays; 5274 days -= absCeil(monthsToDays(monthsFromDays)); 5275 5276 // 12 months -> 1 year 5277 years = absFloor(months / 12); 5278 months %= 12; 5279 5280 data.days = days; 5281 data.months = months; 5282 data.years = years; 5283 5284 return this; 5285 } 5286 5287 function daysToMonths(days) { 5288 // 400 years have 146097 days (taking into account leap year rules) 5289 // 400 years have 12 months === 4800 5290 return (days * 4800) / 146097; 5291 } 5292 5293 function monthsToDays(months) { 5294 // the reverse of daysToMonths 5295 return (months * 146097) / 4800; 5296 } 5297 5298 function as(units) { 5299 if (!this.isValid()) { 5300 return NaN; 5301 } 5302 var days, 5303 months, 5304 milliseconds = this._milliseconds; 5305 5306 units = normalizeUnits(units); 5307 5308 if (units === 'month' || units === 'quarter' || units === 'year') { 5309 days = this._days + milliseconds / 864e5; 5310 months = this._months + daysToMonths(days); 5311 switch (units) { 5312 case 'month': 5313 return months; 5314 case 'quarter': 5315 return months / 3; 5316 case 'year': 5317 return months / 12; 5318 } 5319 } else { 5320 // handle milliseconds separately because of floating point math errors (issue #1867) 5321 days = this._days + Math.round(monthsToDays(this._months)); 5322 switch (units) { 5323 case 'week': 5324 return days / 7 + milliseconds / 6048e5; 5325 case 'day': 5326 return days + milliseconds / 864e5; 5327 case 'hour': 5328 return days * 24 + milliseconds / 36e5; 5329 case 'minute': 5330 return days * 1440 + milliseconds / 6e4; 5331 case 'second': 5332 return days * 86400 + milliseconds / 1000; 5333 // Math.floor prevents floating point math errors here 5334 case 'millisecond': 5335 return Math.floor(days * 864e5) + milliseconds; 5336 default: 5337 throw new Error('Unknown unit ' + units); 5338 } 5339 } 5340 } 5341 5342 // TODO: Use this.as('ms')? 5343 function valueOf$1() { 5344 if (!this.isValid()) { 5345 return NaN; 5346 } 5347 return ( 5348 this._milliseconds + 5349 this._days * 864e5 + 5350 (this._months % 12) * 2592e6 + 5351 toInt(this._months / 12) * 31536e6 5352 ); 5353 } 5354 5355 function makeAs(alias) { 5356 return function () { 5357 return this.as(alias); 5358 }; 5359 } 5360 5361 var asMilliseconds = makeAs('ms'), 5362 asSeconds = makeAs('s'), 5363 asMinutes = makeAs('m'), 5364 asHours = makeAs('h'), 5365 asDays = makeAs('d'), 5366 asWeeks = makeAs('w'), 5367 asMonths = makeAs('M'), 5368 asQuarters = makeAs('Q'), 5369 asYears = makeAs('y'); 5370 5371 function clone$1() { 5372 return createDuration(this); 5373 } 5374 5375 function get$2(units) { 5376 units = normalizeUnits(units); 5377 return this.isValid() ? this[units + 's']() : NaN; 5378 } 5379 5380 function makeGetter(name) { 5381 return function () { 5382 return this.isValid() ? this._data[name] : NaN; 5383 }; 5384 } 5385 5386 var milliseconds = makeGetter('milliseconds'), 5387 seconds = makeGetter('seconds'), 5388 minutes = makeGetter('minutes'), 5389 hours = makeGetter('hours'), 5390 days = makeGetter('days'), 5391 months = makeGetter('months'), 5392 years = makeGetter('years'); 5393 5394 function weeks() { 5395 return absFloor(this.days() / 7); 5396 } 5397 5398 var round = Math.round, 5399 thresholds = { 5400 ss: 44, // a few seconds to seconds 5401 s: 45, // seconds to minute 5402 m: 45, // minutes to hour 5403 h: 22, // hours to day 5404 d: 26, // days to month/week 5405 w: null, // weeks to month 5406 M: 11, // months to year 5407 }; 5408 5409 // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize 5410 function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { 5411 return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); 5412 } 5413 5414 function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) { 5415 var duration = createDuration(posNegDuration).abs(), 5416 seconds = round(duration.as('s')), 5417 minutes = round(duration.as('m')), 5418 hours = round(duration.as('h')), 5419 days = round(duration.as('d')), 5420 months = round(duration.as('M')), 5421 weeks = round(duration.as('w')), 5422 years = round(duration.as('y')), 5423 a = 5424 (seconds <= thresholds.ss && ['s', seconds]) || 5425 (seconds < thresholds.s && ['ss', seconds]) || 5426 (minutes <= 1 && ['m']) || 5427 (minutes < thresholds.m && ['mm', minutes]) || 5428 (hours <= 1 && ['h']) || 5429 (hours < thresholds.h && ['hh', hours]) || 5430 (days <= 1 && ['d']) || 5431 (days < thresholds.d && ['dd', days]); 5432 5433 if (thresholds.w != null) { 5434 a = 5435 a || 5436 (weeks <= 1 && ['w']) || 5437 (weeks < thresholds.w && ['ww', weeks]); 5438 } 5439 a = a || 5440 (months <= 1 && ['M']) || 5441 (months < thresholds.M && ['MM', months]) || 5442 (years <= 1 && ['y']) || ['yy', years]; 5443 5444 a[2] = withoutSuffix; 5445 a[3] = +posNegDuration > 0; 5446 a[4] = locale; 5447 return substituteTimeAgo.apply(null, a); 5448 } 5449 5450 // This function allows you to set the rounding function for relative time strings 5451 function getSetRelativeTimeRounding(roundingFunction) { 5452 if (roundingFunction === undefined) { 5453 return round; 5454 } 5455 if (typeof roundingFunction === 'function') { 5456 round = roundingFunction; 5457 return true; 5458 } 5459 return false; 5460 } 5461 5462 // This function allows you to set a threshold for relative time strings 5463 function getSetRelativeTimeThreshold(threshold, limit) { 5464 if (thresholds[threshold] === undefined) { 5465 return false; 5466 } 5467 if (limit === undefined) { 5468 return thresholds[threshold]; 5469 } 5470 thresholds[threshold] = limit; 5471 if (threshold === 's') { 5472 thresholds.ss = limit - 1; 5473 } 5474 return true; 5475 } 5476 5477 function humanize(argWithSuffix, argThresholds) { 5478 if (!this.isValid()) { 5479 return this.localeData().invalidDate(); 5480 } 5481 5482 var withSuffix = false, 5483 th = thresholds, 5484 locale, 5485 output; 5486 5487 if (typeof argWithSuffix === 'object') { 5488 argThresholds = argWithSuffix; 5489 argWithSuffix = false; 5490 } 5491 if (typeof argWithSuffix === 'boolean') { 5492 withSuffix = argWithSuffix; 5493 } 5494 if (typeof argThresholds === 'object') { 5495 th = Object.assign({}, thresholds, argThresholds); 5496 if (argThresholds.s != null && argThresholds.ss == null) { 5497 th.ss = argThresholds.s - 1; 5498 } 5499 } 5500 5501 locale = this.localeData(); 5502 output = relativeTime$1(this, !withSuffix, th, locale); 5503 5504 if (withSuffix) { 5505 output = locale.pastFuture(+this, output); 5506 } 5507 5508 return locale.postformat(output); 5509 } 5510 5511 var abs$1 = Math.abs; 5512 5513 function sign(x) { 5514 return (x > 0) - (x < 0) || +x; 5515 } 5516 5517 function toISOString$1() { 5518 // for ISO strings we do not use the normal bubbling rules: 5519 // * milliseconds bubble up until they become hours 5520 // * days do not bubble at all 5521 // * months bubble up until they become years 5522 // This is because there is no context-free conversion between hours and days 5523 // (think of clock changes) 5524 // and also not between days and months (28-31 days per month) 5525 if (!this.isValid()) { 5526 return this.localeData().invalidDate(); 5527 } 5528 5529 var seconds = abs$1(this._milliseconds) / 1000, 5530 days = abs$1(this._days), 5531 months = abs$1(this._months), 5532 minutes, 5533 hours, 5534 years, 5535 s, 5536 total = this.asSeconds(), 5537 totalSign, 5538 ymSign, 5539 daysSign, 5540 hmsSign; 5541 5542 if (!total) { 5543 // this is the same as C#'s (Noda) and python (isodate)... 5544 // but not other JS (goog.date) 5545 return 'P0D'; 5546 } 5547 5548 // 3600 seconds -> 60 minutes -> 1 hour 5549 minutes = absFloor(seconds / 60); 5550 hours = absFloor(minutes / 60); 5551 seconds %= 60; 5552 minutes %= 60; 5553 5554 // 12 months -> 1 year 5555 years = absFloor(months / 12); 5556 months %= 12; 5557 5558 // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js 5559 s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; 5560 5561 totalSign = total < 0 ? '-' : ''; 5562 ymSign = sign(this._months) !== sign(total) ? '-' : ''; 5563 daysSign = sign(this._days) !== sign(total) ? '-' : ''; 5564 hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; 5565 5566 return ( 5567 totalSign + 5568 'P' + 5569 (years ? ymSign + years + 'Y' : '') + 5570 (months ? ymSign + months + 'M' : '') + 5571 (days ? daysSign + days + 'D' : '') + 5572 (hours || minutes || seconds ? 'T' : '') + 5573 (hours ? hmsSign + hours + 'H' : '') + 5574 (minutes ? hmsSign + minutes + 'M' : '') + 5575 (seconds ? hmsSign + s + 'S' : '') 5576 ); 5577 } 5578 5579 var proto$2 = Duration.prototype; 5580 5581 proto$2.isValid = isValid$1; 5582 proto$2.abs = abs; 5583 proto$2.add = add$1; 5584 proto$2.subtract = subtract$1; 5585 proto$2.as = as; 5586 proto$2.asMilliseconds = asMilliseconds; 5587 proto$2.asSeconds = asSeconds; 5588 proto$2.asMinutes = asMinutes; 5589 proto$2.asHours = asHours; 5590 proto$2.asDays = asDays; 5591 proto$2.asWeeks = asWeeks; 5592 proto$2.asMonths = asMonths; 5593 proto$2.asQuarters = asQuarters; 5594 proto$2.asYears = asYears; 5595 proto$2.valueOf = valueOf$1; 5596 proto$2._bubble = bubble; 5597 proto$2.clone = clone$1; 5598 proto$2.get = get$2; 5599 proto$2.milliseconds = milliseconds; 5600 proto$2.seconds = seconds; 5601 proto$2.minutes = minutes; 5602 proto$2.hours = hours; 5603 proto$2.days = days; 5604 proto$2.weeks = weeks; 5605 proto$2.months = months; 5606 proto$2.years = years; 5607 proto$2.humanize = humanize; 5608 proto$2.toISOString = toISOString$1; 5609 proto$2.toString = toISOString$1; 5610 proto$2.toJSON = toISOString$1; 5611 proto$2.locale = locale; 5612 proto$2.localeData = localeData; 5613 5614 proto$2.toIsoString = deprecate( 5615 'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', 5616 toISOString$1 5617 ); 5618 proto$2.lang = lang; 5619 5620 // FORMATTING 5621 5622 addFormatToken('X', 0, 0, 'unix'); 5623 addFormatToken('x', 0, 0, 'valueOf'); 5624 5625 // PARSING 5626 5627 addRegexToken('x', matchSigned); 5628 addRegexToken('X', matchTimestamp); 5629 addParseToken('X', function (input, array, config) { 5630 config._d = new Date(parseFloat(input) * 1000); 5631 }); 5632 addParseToken('x', function (input, array, config) { 5633 config._d = new Date(toInt(input)); 5634 }); 5635 5636 //! moment.js 5637 5638 hooks.version = '2.29.2'; 5639 5640 setHookCallback(createLocal); 5641 5642 hooks.fn = proto; 5643 hooks.min = min; 5644 hooks.max = max; 5645 hooks.now = now; 5646 hooks.utc = createUTC; 5647 hooks.unix = createUnix; 5648 hooks.months = listMonths; 5649 hooks.isDate = isDate; 5650 hooks.locale = getSetGlobalLocale; 5651 hooks.invalid = createInvalid; 5652 hooks.duration = createDuration; 5653 hooks.isMoment = isMoment; 5654 hooks.weekdays = listWeekdays; 5655 hooks.parseZone = createInZone; 5656 hooks.localeData = getLocale; 5657 hooks.isDuration = isDuration; 5658 hooks.monthsShort = listMonthsShort; 5659 hooks.weekdaysMin = listWeekdaysMin; 5660 hooks.defineLocale = defineLocale; 5661 hooks.updateLocale = updateLocale; 5662 hooks.locales = listLocales; 5663 hooks.weekdaysShort = listWeekdaysShort; 5664 hooks.normalizeUnits = normalizeUnits; 5665 hooks.relativeTimeRounding = getSetRelativeTimeRounding; 5666 hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; 5667 hooks.calendarFormat = getCalendarFormat; 5668 hooks.prototype = proto; 5669 5670 // currently HTML5 input type only supports 24-hour formats 5671 hooks.HTML5_FMT = { 5672 DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" /> 5673 DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" /> 5674 DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" /> 5675 DATE: 'YYYY-MM-DD', // <input type="date" /> 5676 TIME: 'HH:mm', // <input type="time" /> 5677 TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" /> 5678 TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" /> 5679 WEEK: 'GGGG-[W]WW', // <input type="week" /> 5680 MONTH: 'YYYY-MM', // <input type="month" /> 5681 }; 5682 5683 return hooks; 5684 5685 })));
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sat Dec 14 01:00:02 2024 | Cross-referenced by PHPXref 0.7.1 |