2014-08-21 02:41:50 +08:00
//! moment.js
2016-04-01 05:33:25 +08:00
//! version : 2.11.2
2014-08-21 02:41:50 +08:00
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
//! license : MIT
//! momentjs.com
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
; ( function ( global , factory ) {
typeof exports === 'object' && typeof module !== 'undefined' ? module . exports = factory ( ) :
typeof define === 'function' && define . amd ? define ( factory ) :
global . moment = factory ( )
} ( this , function ( ) { 'use strict' ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
var hookCallback ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function utils _hooks _ _hooks ( ) {
return hookCallback . apply ( null , arguments ) ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
// This is done to register the method called with moment()
// without creating circular dependencies.
function setHookCallback ( callback ) {
hookCallback = callback ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
function isArray ( input ) {
return Object . prototype . toString . call ( input ) === '[object Array]' ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
function isDate ( input ) {
return input instanceof Date || Object . prototype . toString . call ( input ) === '[object Date]' ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
function map ( arr , fn ) {
var res = [ ] , i ;
for ( i = 0 ; i < arr . length ; ++ i ) {
res . push ( fn ( arr [ i ] , i ) ) ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
return res ;
2014-08-21 02:41:50 +08:00
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function hasOwnProp ( a , b ) {
return Object . prototype . hasOwnProperty . call ( a , b ) ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
function extend ( a , b ) {
for ( var i in b ) {
if ( hasOwnProp ( b , i ) ) {
a [ i ] = b [ i ] ;
}
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
if ( hasOwnProp ( b , 'toString' ) ) {
a . toString = b . toString ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
if ( hasOwnProp ( b , 'valueOf' ) ) {
a . valueOf = b . valueOf ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
return a ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
function create _utc _ _createUTC ( input , format , locale , strict ) {
return createLocalOrUTC ( input , format , locale , strict , true ) . utc ( ) ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
function defaultParsingFlags ( ) {
// We need to deep clone this object.
return {
empty : false ,
unusedTokens : [ ] ,
unusedInput : [ ] ,
overflow : - 2 ,
charsLeftOver : 0 ,
nullInput : false ,
invalidMonth : null ,
invalidFormat : false ,
userInvalidated : false ,
iso : false
} ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
function getParsingFlags ( m ) {
if ( m . _pf == null ) {
m . _pf = defaultParsingFlags ( ) ;
}
return m . _pf ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function valid _ _isValid ( m ) {
if ( m . _isValid == null ) {
var flags = getParsingFlags ( m ) ;
m . _isValid = ! isNaN ( m . _d . getTime ( ) ) &&
flags . overflow < 0 &&
! flags . empty &&
! flags . invalidMonth &&
! flags . invalidWeekday &&
! flags . nullInput &&
! flags . invalidFormat &&
! flags . userInvalidated ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
if ( m . _strict ) {
m . _isValid = m . _isValid &&
flags . charsLeftOver === 0 &&
flags . unusedTokens . length === 0 &&
flags . bigHour === undefined ;
2013-06-07 06:49:09 +08:00
}
}
2016-04-01 05:33:25 +08:00
return m . _isValid ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function valid _ _createInvalid ( flags ) {
var m = create _utc _ _createUTC ( NaN ) ;
if ( flags != null ) {
extend ( getParsingFlags ( m ) , flags ) ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
else {
getParsingFlags ( m ) . userInvalidated = true ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
return m ;
}
function isUndefined ( input ) {
return input === void 0 ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
// Plugins that add properties should also add the key here (null value),
// so we can properly clone ourselves.
var momentProperties = utils _hooks _ _hooks . momentProperties = [ ] ;
2014-08-21 02:41:50 +08:00
function copyConfig ( to , from ) {
var i , prop , val ;
2016-04-01 05:33:25 +08:00
if ( ! isUndefined ( from . _isAMomentObject ) ) {
2014-08-21 02:41:50 +08:00
to . _isAMomentObject = from . _isAMomentObject ;
}
2016-04-01 05:33:25 +08:00
if ( ! isUndefined ( from . _i ) ) {
2014-08-21 02:41:50 +08:00
to . _i = from . _i ;
}
2016-04-01 05:33:25 +08:00
if ( ! isUndefined ( from . _f ) ) {
2014-08-21 02:41:50 +08:00
to . _f = from . _f ;
}
2016-04-01 05:33:25 +08:00
if ( ! isUndefined ( from . _l ) ) {
2014-08-21 02:41:50 +08:00
to . _l = from . _l ;
}
2016-04-01 05:33:25 +08:00
if ( ! isUndefined ( from . _strict ) ) {
2014-08-21 02:41:50 +08:00
to . _strict = from . _strict ;
}
2016-04-01 05:33:25 +08:00
if ( ! isUndefined ( from . _tzm ) ) {
2014-08-21 02:41:50 +08:00
to . _tzm = from . _tzm ;
}
2016-04-01 05:33:25 +08:00
if ( ! isUndefined ( from . _isUTC ) ) {
2014-08-21 02:41:50 +08:00
to . _isUTC = from . _isUTC ;
}
2016-04-01 05:33:25 +08:00
if ( ! isUndefined ( from . _offset ) ) {
2014-08-21 02:41:50 +08:00
to . _offset = from . _offset ;
}
2016-04-01 05:33:25 +08:00
if ( ! isUndefined ( from . _pf ) ) {
to . _pf = getParsingFlags ( from ) ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
if ( ! isUndefined ( from . _locale ) ) {
2014-08-21 02:41:50 +08:00
to . _locale = from . _locale ;
}
if ( momentProperties . length > 0 ) {
for ( i in momentProperties ) {
prop = momentProperties [ i ] ;
val = from [ prop ] ;
2016-04-01 05:33:25 +08:00
if ( ! isUndefined ( val ) ) {
2014-08-21 02:41:50 +08:00
to [ prop ] = val ;
}
}
}
return to ;
}
2016-04-01 05:33:25 +08:00
var updateInProgress = false ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// Moment prototype object
function Moment ( config ) {
copyConfig ( this , config ) ;
this . _d = new Date ( config . _d != null ? config . _d . getTime ( ) : NaN ) ;
// Prevent infinite loop in case updateOffset creates new moment
// objects.
if ( updateInProgress === false ) {
updateInProgress = true ;
utils _hooks _ _hooks . updateOffset ( this ) ;
updateInProgress = false ;
2013-06-07 06:49:09 +08:00
}
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
function isMoment ( obj ) {
return obj instanceof Moment || ( obj != null && obj . _isAMomentObject != null ) ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
function absFloor ( number ) {
if ( number < 0 ) {
return Math . ceil ( number ) ;
2014-08-21 02:41:50 +08:00
} else {
2016-04-01 05:33:25 +08:00
return Math . floor ( number ) ;
2014-08-21 02:41:50 +08:00
}
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
function toInt ( argumentForCoercion ) {
var coercedNumber = + argumentForCoercion ,
value = 0 ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
if ( coercedNumber !== 0 && isFinite ( coercedNumber ) ) {
value = absFloor ( coercedNumber ) ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
return value ;
2014-08-21 02:41:50 +08:00
}
2013-06-07 06:49:09 +08:00
// compare two arrays, return the number of differences
2014-08-21 02:41:50 +08:00
function compareArrays ( array1 , array2 , dontConvert ) {
2013-06-07 06:49:09 +08:00
var len = Math . min ( array1 . length , array2 . length ) ,
lengthDiff = Math . abs ( array1 . length - array2 . length ) ,
diffs = 0 ,
i ;
for ( i = 0 ; i < len ; i ++ ) {
2014-08-21 02:41:50 +08:00
if ( ( dontConvert && array1 [ i ] !== array2 [ i ] ) ||
( ! dontConvert && toInt ( array1 [ i ] ) !== toInt ( array2 [ i ] ) ) ) {
2013-06-07 06:49:09 +08:00
diffs ++ ;
}
}
return diffs + lengthDiff ;
}
2016-04-01 05:33:25 +08:00
function Locale ( ) {
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
// internal storage for locale config files
var locales = { } ;
var globalLocale ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function normalizeLocale ( key ) {
return key ? key . toLowerCase ( ) . replace ( '_' , '-' ) : key ;
}
// pick the locale from the array
// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
function chooseLocale ( names ) {
var i = 0 , j , next , locale , split ;
while ( i < names . length ) {
split = normalizeLocale ( names [ i ] ) . split ( '-' ) ;
j = split . length ;
next = normalizeLocale ( names [ i + 1 ] ) ;
next = next ? next . split ( '-' ) : null ;
while ( j > 0 ) {
locale = loadLocale ( split . slice ( 0 , j ) . join ( '-' ) ) ;
if ( locale ) {
return locale ;
}
if ( next && next . length >= j && compareArrays ( split , next , true ) >= j - 1 ) {
//the next array item is better than a shallower substring of this one
break ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
j -- ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
i ++ ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
return null ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
function loadLocale ( name ) {
var oldLocale = null ;
// TODO: Find a better way to register and load all the locales in Node
if ( ! locales [ name ] && ( typeof module !== 'undefined' ) &&
module && module . exports ) {
try {
oldLocale = globalLocale . _abbr ;
require ( './locale/' + name ) ;
// because defineLocale currently also sets the global locale, we
// want to undo that for lazy loaded locales
locale _locales _ _getSetGlobalLocale ( oldLocale ) ;
} catch ( e ) { }
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
return locales [ name ] ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// This function will load locale and then set the global locale. If
// no arguments are passed in, it will simply return the current global
// locale key.
function locale _locales _ _getSetGlobalLocale ( key , values ) {
var data ;
if ( key ) {
if ( isUndefined ( values ) ) {
data = locale _locales _ _getLocale ( key ) ;
2014-08-21 02:41:50 +08:00
}
else {
2016-04-01 05:33:25 +08:00
data = defineLocale ( key , values ) ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
if ( data ) {
// moment.duration._locale = moment._locale = data;
globalLocale = data ;
2014-08-21 02:41:50 +08:00
}
}
2016-04-01 05:33:25 +08:00
return globalLocale . _abbr ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
function defineLocale ( name , values ) {
if ( values !== null ) {
values . abbr = name ;
locales [ name ] = locales [ name ] || new Locale ( ) ;
locales [ name ] . set ( values ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// backwards compat for now: also set the locale
locale _locales _ _getSetGlobalLocale ( name ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
return locales [ name ] ;
} else {
// useful for testing
delete locales [ name ] ;
return null ;
}
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
// returns locale data
function locale _locales _ _getLocale ( key ) {
var locale ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
if ( key && key . _locale && key . _locale . _abbr ) {
key = key . _locale . _abbr ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
if ( ! key ) {
return globalLocale ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
if ( ! isArray ( key ) ) {
//short-circuit everything else
locale = loadLocale ( key ) ;
if ( locale ) {
return locale ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
key = [ key ] ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
return chooseLocale ( key ) ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
var aliases = { } ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function addUnitAlias ( unit , shorthand ) {
var lowerCase = unit . toLowerCase ( ) ;
aliases [ lowerCase ] = aliases [ lowerCase + 's' ] = aliases [ shorthand ] = unit ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
function normalizeUnits ( units ) {
return typeof units === 'string' ? aliases [ units ] || aliases [ units . toLowerCase ( ) ] : undefined ;
2014-08-21 02:41:50 +08:00
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function normalizeObjectUnits ( inputObject ) {
var normalizedInput = { } ,
normalizedProp ,
prop ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
for ( prop in inputObject ) {
if ( hasOwnProp ( inputObject , prop ) ) {
normalizedProp = normalizeUnits ( prop ) ;
if ( normalizedProp ) {
normalizedInput [ normalizedProp ] = inputObject [ prop ] ;
2013-06-07 06:49:09 +08:00
}
}
2016-04-01 05:33:25 +08:00
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
return normalizedInput ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function isFunction ( input ) {
return input instanceof Function || Object . prototype . toString . call ( input ) === '[object Function]' ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function makeGetSet ( unit , keepTime ) {
return function ( value ) {
if ( value != null ) {
get _set _ _set ( this , unit , value ) ;
utils _hooks _ _hooks . updateOffset ( this , keepTime ) ;
return this ;
} else {
return get _set _ _get ( this , unit ) ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
} ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function get _set _ _get ( mom , unit ) {
return mom . isValid ( ) ?
mom . _d [ 'get' + ( mom . _isUTC ? 'UTC' : '' ) + unit ] ( ) : NaN ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function get _set _ _set ( mom , unit , value ) {
if ( mom . isValid ( ) ) {
mom . _d [ 'set' + ( mom . _isUTC ? 'UTC' : '' ) + unit ] ( value ) ;
}
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// MOMENTS
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function getSet ( units , value ) {
var unit ;
if ( typeof units === 'object' ) {
for ( unit in units ) {
this . set ( unit , units [ unit ] ) ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
} else {
units = normalizeUnits ( units ) ;
if ( isFunction ( this [ units ] ) ) {
return this [ units ] ( value ) ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
}
return this ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function zeroFill ( number , targetLength , forceSign ) {
var absNumber = '' + Math . abs ( number ) ,
zerosToFill = targetLength - absNumber . length ,
sign = number >= 0 ;
return ( sign ? ( forceSign ? '+' : '' ) : '-' ) +
Math . pow ( 10 , Math . max ( 0 , zerosToFill ) ) . toString ( ) . substr ( 1 ) + absNumber ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var formatFunctions = { } ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
var formatTokenFunctions = { } ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// token: 'M'
// padded: ['MM', 2]
// ordinal: 'Mo'
// callback: function () { this.month() + 1 }
function addFormatToken ( token , padded , ordinal , callback ) {
var func = callback ;
if ( typeof callback === 'string' ) {
func = function ( ) {
return this [ callback ] ( ) ;
} ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
if ( token ) {
formatTokenFunctions [ token ] = func ;
}
if ( padded ) {
formatTokenFunctions [ padded [ 0 ] ] = function ( ) {
return zeroFill ( func . apply ( this , arguments ) , padded [ 1 ] , padded [ 2 ] ) ;
} ;
}
if ( ordinal ) {
formatTokenFunctions [ ordinal ] = function ( ) {
return this . localeData ( ) . ordinal ( func . apply ( this , arguments ) , token ) ;
} ;
}
}
2013-06-07 06:49:09 +08:00
function removeFormattingTokens ( input ) {
2014-08-21 02:41:50 +08:00
if ( input . match ( /\[[\s\S]/ ) ) {
return input . replace ( /^\[|\]$/g , '' ) ;
2013-06-07 06:49:09 +08:00
}
2014-08-21 02:41:50 +08:00
return input . replace ( /\\/g , '' ) ;
2013-06-07 06:49:09 +08:00
}
function makeFormatFunction ( format ) {
var array = format . match ( formattingTokens ) , i , length ;
for ( i = 0 , length = array . length ; i < length ; i ++ ) {
if ( formatTokenFunctions [ array [ i ] ] ) {
array [ i ] = formatTokenFunctions [ array [ i ] ] ;
} else {
array [ i ] = removeFormattingTokens ( array [ i ] ) ;
}
}
return function ( mom ) {
2014-08-21 02:41:50 +08:00
var output = '' ;
2013-06-07 06:49:09 +08:00
for ( i = 0 ; i < length ; i ++ ) {
output += array [ i ] instanceof Function ? array [ i ] . call ( mom , format ) : array [ i ] ;
}
return output ;
} ;
}
// format date using native date object
function formatMoment ( m , format ) {
2014-08-21 02:41:50 +08:00
if ( ! m . isValid ( ) ) {
return m . localeData ( ) . invalidDate ( ) ;
2013-06-07 06:49:09 +08:00
}
2014-08-21 02:41:50 +08:00
format = expandFormat ( format , m . localeData ( ) ) ;
2016-04-01 05:33:25 +08:00
formatFunctions [ format ] = formatFunctions [ format ] || makeFormatFunction ( format ) ;
2013-06-07 06:49:09 +08:00
return formatFunctions [ format ] ( m ) ;
}
2014-08-21 02:41:50 +08:00
function expandFormat ( format , locale ) {
var i = 5 ;
function replaceLongDateFormatTokens ( input ) {
return locale . longDateFormat ( input ) || input ;
}
localFormattingTokens . lastIndex = 0 ;
while ( i >= 0 && localFormattingTokens . test ( format ) ) {
format = format . replace ( localFormattingTokens , replaceLongDateFormatTokens ) ;
localFormattingTokens . lastIndex = 0 ;
i -= 1 ;
}
return format ;
}
2016-04-01 05:33:25 +08:00
var match1 = /\d/ ; // 0 - 9
var match2 = /\d\d/ ; // 00 - 99
var match3 = /\d{3}/ ; // 000 - 999
var match4 = /\d{4}/ ; // 0000 - 9999
var match6 = /[+-]?\d{6}/ ; // -999999 - 999999
var match1to2 = /\d\d?/ ; // 0 - 99
var match3to4 = /\d\d\d\d?/ ; // 999 - 9999
var match5to6 = /\d\d\d\d\d\d?/ ; // 99999 - 999999
var match1to3 = /\d{1,3}/ ; // 0 - 999
var match1to4 = /\d{1,4}/ ; // 0 - 9999
var match1to6 = /[+-]?\d{1,6}/ ; // -999999 - 999999
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var matchUnsigned = /\d+/ ; // 0 - inf
var matchSigned = /[+-]?\d+/ ; // -inf - inf
var matchOffset = /Z|[+-]\d\d:?\d\d/gi ; // +00:00 -00:00 +0000 -0000 or Z
var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi ; // +00 -00 +00:00 -00:00 +0000 -0000 or Z
var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/ ; // 123456789 123456789.123
// any word (or two) characters or numbers including two/three word month in arabic.
// includes scottish gaelic two word and hyphenated months
var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var regexes = { } ;
function addRegexToken ( token , regex , strictRegex ) {
regexes [ token ] = isFunction ( regex ) ? regex : function ( isStrict , localeData ) {
return ( isStrict && strictRegex ) ? strictRegex : regex ;
} ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
function getParseRegexForToken ( token , config ) {
if ( ! hasOwnProp ( regexes , token ) ) {
return new RegExp ( unescapeFormat ( token ) ) ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
return regexes [ token ] ( config . _strict , config . _locale ) ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
function unescapeFormat ( s ) {
return regexEscape ( s . replace ( '\\' , '' ) . replace ( /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g , function ( matched , p1 , p2 , p3 , p4 ) {
return p1 || p2 || p3 || p4 ;
} ) ) ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function regexEscape ( s ) {
return s . replace ( /[-\/\\^$*+?.()|[\]{}]/g , '\\$&' ) ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
var tokens = { } ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function addParseToken ( token , callback ) {
var i , func = callback ;
if ( typeof token === 'string' ) {
token = [ token ] ;
}
if ( typeof callback === 'number' ) {
func = function ( input , array ) {
array [ callback ] = toInt ( input ) ;
} ;
}
for ( i = 0 ; i < token . length ; i ++ ) {
tokens [ token [ i ] ] = func ;
2013-06-07 06:49:09 +08:00
}
}
2016-04-01 05:33:25 +08:00
function addWeekParseToken ( token , callback ) {
addParseToken ( token , function ( input , array , config , token ) {
config . _w = config . _w || { } ;
callback ( input , config . _w , config , token ) ;
} ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function addTimeToArrayFromToken ( token , input , config ) {
if ( input != null && hasOwnProp ( tokens , token ) ) {
tokens [ token ] ( input , config . _a , config , token ) ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var YEAR = 0 ;
var MONTH = 1 ;
var DATE = 2 ;
var HOUR = 3 ;
var MINUTE = 4 ;
var SECOND = 5 ;
var MILLISECOND = 6 ;
var WEEK = 7 ;
var WEEKDAY = 8 ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function daysInMonth ( year , month ) {
return new Date ( Date . UTC ( year , month + 1 , 0 ) ) . getUTCDate ( ) ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// FORMATTING
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 'M' , [ 'MM' , 2 ] , 'Mo' , function ( ) {
return this . month ( ) + 1 ;
} ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 'MMM' , 0 , 0 , function ( format ) {
return this . localeData ( ) . monthsShort ( this , format ) ;
} ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 'MMMM' , 0 , 0 , function ( format ) {
return this . localeData ( ) . months ( this , format ) ;
} ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// ALIASES
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addUnitAlias ( 'month' , 'M' ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// PARSING
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
addRegexToken ( 'M' , match1to2 ) ;
addRegexToken ( 'MM' , match1to2 , match2 ) ;
addRegexToken ( 'MMM' , function ( isStrict , locale ) {
return locale . monthsShortRegex ( isStrict ) ;
} ) ;
addRegexToken ( 'MMMM' , function ( isStrict , locale ) {
return locale . monthsRegex ( isStrict ) ;
} ) ;
addParseToken ( [ 'M' , 'MM' ] , function ( input , array ) {
array [ MONTH ] = toInt ( input ) - 1 ;
} ) ;
addParseToken ( [ 'MMM' , 'MMMM' ] , function ( input , array , config , token ) {
var month = config . _locale . monthsParse ( input , token , config . _strict ) ;
// if we didn't find a month name, mark the date as invalid.
if ( month != null ) {
array [ MONTH ] = month ;
} else {
getParsingFlags ( config ) . invalidMonth = input ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
} ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// LOCALES
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
var MONTHS _IN _FORMAT = /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/ ;
var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December' . split ( '_' ) ;
function localeMonths ( m , format ) {
return isArray ( this . _months ) ? this . _months [ m . month ( ) ] :
this . _months [ MONTHS _IN _FORMAT . test ( format ) ? 'format' : 'standalone' ] [ m . month ( ) ] ;
2014-08-21 02:41:50 +08:00
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec' . split ( '_' ) ;
function localeMonthsShort ( m , format ) {
return isArray ( this . _monthsShort ) ? this . _monthsShort [ m . month ( ) ] :
this . _monthsShort [ MONTHS _IN _FORMAT . test ( format ) ? 'format' : 'standalone' ] [ m . month ( ) ] ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
function localeMonthsParse ( monthName , format , strict ) {
var i , mom , regex ;
if ( ! this . _monthsParse ) {
this . _monthsParse = [ ] ;
this . _longMonthsParse = [ ] ;
this . _shortMonthsParse = [ ] ;
2014-08-21 02:41:50 +08:00
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
for ( i = 0 ; i < 12 ; i ++ ) {
// make the regex if we don't have it already
mom = create _utc _ _createUTC ( [ 2000 , i ] ) ;
if ( strict && ! this . _longMonthsParse [ i ] ) {
this . _longMonthsParse [ i ] = new RegExp ( '^' + this . months ( mom , '' ) . replace ( '.' , '' ) + '$' , 'i' ) ;
this . _shortMonthsParse [ i ] = new RegExp ( '^' + this . monthsShort ( mom , '' ) . replace ( '.' , '' ) + '$' , 'i' ) ;
}
if ( ! strict && ! this . _monthsParse [ i ] ) {
regex = '^' + this . months ( mom , '' ) + '|^' + this . monthsShort ( mom , '' ) ;
this . _monthsParse [ i ] = new RegExp ( regex . replace ( '.' , '' ) , 'i' ) ;
}
// test the regex
if ( strict && format === 'MMMM' && this . _longMonthsParse [ i ] . test ( monthName ) ) {
return i ;
} else if ( strict && format === 'MMM' && this . _shortMonthsParse [ i ] . test ( monthName ) ) {
return i ;
} else if ( ! strict && this . _monthsParse [ i ] . test ( monthName ) ) {
return i ;
}
}
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// MOMENTS
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function setMonth ( mom , value ) {
var dayOfMonth ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
if ( ! mom . isValid ( ) ) {
// No op
return mom ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
// TODO: Move this out of here!
if ( typeof value === 'string' ) {
value = mom . localeData ( ) . monthsParse ( value ) ;
// TODO: Another silent failure?
if ( typeof value !== 'number' ) {
return mom ;
}
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
dayOfMonth = Math . min ( mom . date ( ) , daysInMonth ( mom . year ( ) , value ) ) ;
mom . _d [ 'set' + ( mom . _isUTC ? 'UTC' : '' ) + 'Month' ] ( value , dayOfMonth ) ;
return mom ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function getSetMonth ( value ) {
if ( value != null ) {
setMonth ( this , value ) ;
utils _hooks _ _hooks . updateOffset ( this , true ) ;
return this ;
} else {
return get _set _ _get ( this , 'Month' ) ;
}
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
function getDaysInMonth ( ) {
return daysInMonth ( this . year ( ) , this . month ( ) ) ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
var defaultMonthsShortRegex = matchWord ;
function monthsShortRegex ( isStrict ) {
if ( this . _monthsParseExact ) {
if ( ! hasOwnProp ( this , '_monthsRegex' ) ) {
computeMonthsParse . call ( this ) ;
}
if ( isStrict ) {
return this . _monthsShortStrictRegex ;
} else {
return this . _monthsShortRegex ;
}
} else {
return this . _monthsShortStrictRegex && isStrict ?
this . _monthsShortStrictRegex : this . _monthsShortRegex ;
}
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
var defaultMonthsRegex = matchWord ;
function monthsRegex ( isStrict ) {
if ( this . _monthsParseExact ) {
if ( ! hasOwnProp ( this , '_monthsRegex' ) ) {
computeMonthsParse . call ( this ) ;
}
if ( isStrict ) {
return this . _monthsStrictRegex ;
} else {
return this . _monthsRegex ;
}
} else {
return this . _monthsStrictRegex && isStrict ?
this . _monthsStrictRegex : this . _monthsRegex ;
}
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function computeMonthsParse ( ) {
function cmpLenRev ( a , b ) {
return b . length - a . length ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var shortPieces = [ ] , longPieces = [ ] , mixedPieces = [ ] ,
i , mom ;
for ( i = 0 ; i < 12 ; i ++ ) {
// make the regex if we don't have it already
mom = create _utc _ _createUTC ( [ 2000 , i ] ) ;
shortPieces . push ( this . monthsShort ( mom , '' ) ) ;
longPieces . push ( this . months ( mom , '' ) ) ;
mixedPieces . push ( this . months ( mom , '' ) ) ;
mixedPieces . push ( this . monthsShort ( mom , '' ) ) ;
}
// Sorting makes sure if one month (or abbr) is a prefix of another it
// will match the longer piece.
shortPieces . sort ( cmpLenRev ) ;
longPieces . sort ( cmpLenRev ) ;
mixedPieces . sort ( cmpLenRev ) ;
for ( i = 0 ; i < 12 ; i ++ ) {
shortPieces [ i ] = regexEscape ( shortPieces [ i ] ) ;
longPieces [ i ] = regexEscape ( longPieces [ i ] ) ;
mixedPieces [ i ] = regexEscape ( mixedPieces [ i ] ) ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
this . _monthsRegex = new RegExp ( '^(' + mixedPieces . join ( '|' ) + ')' , 'i' ) ;
this . _monthsShortRegex = this . _monthsRegex ;
this . _monthsStrictRegex = new RegExp ( '^(' + longPieces . join ( '|' ) + ')$' , 'i' ) ;
this . _monthsShortStrictRegex = new RegExp ( '^(' + shortPieces . join ( '|' ) + ')$' , 'i' ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function checkOverflow ( m ) {
var overflow ;
var a = m . _a ;
if ( a && getParsingFlags ( m ) . overflow === - 2 ) {
overflow =
a [ MONTH ] < 0 || a [ MONTH ] > 11 ? MONTH :
a [ DATE ] < 1 || a [ DATE ] > daysInMonth ( a [ YEAR ] , a [ MONTH ] ) ? DATE :
a [ HOUR ] < 0 || a [ HOUR ] > 24 || ( a [ HOUR ] === 24 && ( a [ MINUTE ] !== 0 || a [ SECOND ] !== 0 || a [ MILLISECOND ] !== 0 ) ) ? HOUR :
a [ MINUTE ] < 0 || a [ MINUTE ] > 59 ? MINUTE :
a [ SECOND ] < 0 || a [ SECOND ] > 59 ? SECOND :
a [ MILLISECOND ] < 0 || a [ MILLISECOND ] > 999 ? MILLISECOND :
- 1 ;
if ( getParsingFlags ( m ) . _overflowDayOfYear && ( overflow < YEAR || overflow > DATE ) ) {
overflow = DATE ;
}
if ( getParsingFlags ( m ) . _overflowWeeks && overflow === - 1 ) {
overflow = WEEK ;
}
if ( getParsingFlags ( m ) . _overflowWeekday && overflow === - 1 ) {
overflow = WEEKDAY ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
getParsingFlags ( m ) . overflow = overflow ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
return m ;
}
function warn ( msg ) {
if ( utils _hooks _ _hooks . suppressDeprecationWarnings === false &&
( typeof console !== 'undefined' ) && console . warn ) {
console . warn ( 'Deprecation warning: ' + msg ) ;
}
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function deprecate ( msg , fn ) {
var firstTime = true ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
return extend ( function ( ) {
if ( firstTime ) {
warn ( msg + '\nArguments: ' + Array . prototype . slice . call ( arguments ) . join ( ', ' ) + '\n' + ( new Error ( ) ) . stack ) ;
firstTime = false ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
return fn . apply ( this , arguments ) ;
} , fn ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var deprecations = { } ;
function deprecateSimple ( name , msg ) {
if ( ! deprecations [ name ] ) {
warn ( msg ) ;
deprecations [ name ] = true ;
}
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
utils _hooks _ _hooks . suppressDeprecationWarnings = false ;
// iso 8601 regex
// 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)
var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/ ;
var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/ ;
var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/ ;
var isoDates = [
[ 'YYYYYY-MM-DD' , /[+-]\d{6}-\d\d-\d\d/ ] ,
[ 'YYYY-MM-DD' , /\d{4}-\d\d-\d\d/ ] ,
[ 'GGGG-[W]WW-E' , /\d{4}-W\d\d-\d/ ] ,
[ 'GGGG-[W]WW' , /\d{4}-W\d\d/ , false ] ,
[ 'YYYY-DDD' , /\d{4}-\d{3}/ ] ,
[ 'YYYY-MM' , /\d{4}-\d\d/ , false ] ,
[ 'YYYYYYMMDD' , /[+-]\d{10}/ ] ,
[ 'YYYYMMDD' , /\d{8}/ ] ,
// YYYYMM is NOT allowed by the standard
[ 'GGGG[W]WWE' , /\d{4}W\d{3}/ ] ,
[ 'GGGG[W]WW' , /\d{4}W\d{2}/ , false ] ,
[ 'YYYYDDD' , /\d{7}/ ]
] ;
// iso time formats and regexes
var isoTimes = [
[ 'HH:mm:ss.SSSS' , /\d\d:\d\d:\d\d\.\d+/ ] ,
[ 'HH:mm:ss,SSSS' , /\d\d:\d\d:\d\d,\d+/ ] ,
[ 'HH:mm:ss' , /\d\d:\d\d:\d\d/ ] ,
[ 'HH:mm' , /\d\d:\d\d/ ] ,
[ 'HHmmss.SSSS' , /\d\d\d\d\d\d\.\d+/ ] ,
[ 'HHmmss,SSSS' , /\d\d\d\d\d\d,\d+/ ] ,
[ 'HHmmss' , /\d\d\d\d\d\d/ ] ,
[ 'HHmm' , /\d\d\d\d/ ] ,
[ 'HH' , /\d\d/ ]
] ;
var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i ;
2013-06-07 06:49:09 +08:00
// date from iso format
2016-04-01 05:33:25 +08:00
function configFromISO ( config ) {
2014-08-21 02:41:50 +08:00
var i , l ,
2013-06-07 06:49:09 +08:00
string = config . _i ,
2016-04-01 05:33:25 +08:00
match = extendedIsoRegex . exec ( string ) || basicIsoRegex . exec ( string ) ,
allowTime , dateFormat , timeFormat , tzFormat ;
2013-06-07 06:49:09 +08:00
if ( match ) {
2016-04-01 05:33:25 +08:00
getParsingFlags ( config ) . iso = true ;
2014-08-21 02:41:50 +08:00
for ( i = 0 , l = isoDates . length ; i < l ; i ++ ) {
2016-04-01 05:33:25 +08:00
if ( isoDates [ i ] [ 1 ] . exec ( match [ 1 ] ) ) {
dateFormat = isoDates [ i ] [ 0 ] ;
allowTime = isoDates [ i ] [ 2 ] !== false ;
2014-08-21 02:41:50 +08:00
break ;
}
}
2016-04-01 05:33:25 +08:00
if ( dateFormat == null ) {
config . _isValid = false ;
return ;
}
if ( match [ 3 ] ) {
for ( i = 0 , l = isoTimes . length ; i < l ; i ++ ) {
if ( isoTimes [ i ] [ 1 ] . exec ( match [ 3 ] ) ) {
// match[2] should be 'T' or space
timeFormat = ( match [ 2 ] || ' ' ) + isoTimes [ i ] [ 0 ] ;
break ;
}
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
if ( timeFormat == null ) {
config . _isValid = false ;
return ;
}
}
if ( ! allowTime && timeFormat != null ) {
config . _isValid = false ;
return ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
if ( match [ 4 ] ) {
if ( tzRegex . exec ( match [ 4 ] ) ) {
tzFormat = 'Z' ;
} else {
config . _isValid = false ;
return ;
}
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
config . _f = dateFormat + ( timeFormat || '' ) + ( tzFormat || '' ) ;
configFromStringAndFormat ( config ) ;
2013-06-07 06:49:09 +08:00
} else {
2014-08-21 02:41:50 +08:00
config . _isValid = false ;
2013-06-07 06:49:09 +08:00
}
}
2014-08-21 02:41:50 +08:00
// date from iso format or fallback
2016-04-01 05:33:25 +08:00
function configFromString ( config ) {
var matched = aspNetJsonRegex . exec ( config . _i ) ;
if ( matched !== null ) {
config . _d = new Date ( + matched [ 1 ] ) ;
return ;
}
configFromISO ( config ) ;
2014-08-21 02:41:50 +08:00
if ( config . _isValid === false ) {
delete config . _isValid ;
2016-04-01 05:33:25 +08:00
utils _hooks _ _hooks . createFromInputFallback ( config ) ;
2014-08-21 02:41:50 +08:00
}
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
utils _hooks _ _hooks . createFromInputFallback = deprecate (
'moment construction falls back to js Date. This is ' +
'discouraged and will be removed in upcoming major ' +
'release. Please refer to ' +
'https://github.com/moment/moment/issues/1407 for more info.' ,
function ( config ) {
config . _d = new Date ( config . _i + ( config . _useUTC ? ' UTC' : '' ) ) ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function createDate ( y , m , d , h , M , s , ms ) {
2014-08-21 02:41:50 +08:00
//can't just apply() to create a date:
//http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
var date = new Date ( y , m , d , h , M , s , ms ) ;
2016-04-01 05:33:25 +08:00
//the date constructor remaps years 0-99 to 1900-1999
if ( y < 100 && y >= 0 && isFinite ( date . getFullYear ( ) ) ) {
2014-08-21 02:41:50 +08:00
date . setFullYear ( y ) ;
}
return date ;
}
2016-04-01 05:33:25 +08:00
function createUTCDate ( y ) {
2014-08-21 02:41:50 +08:00
var date = new Date ( Date . UTC . apply ( null , arguments ) ) ;
2016-04-01 05:33:25 +08:00
//the Date.UTC function remaps years 0-99 to 1900-1999
if ( y < 100 && y >= 0 && isFinite ( date . getUTCFullYear ( ) ) ) {
2014-08-21 02:41:50 +08:00
date . setUTCFullYear ( y ) ;
}
return date ;
}
2016-04-01 05:33:25 +08:00
// FORMATTING
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 'Y' , 0 , 0 , function ( ) {
var y = this . year ( ) ;
return y <= 9999 ? '' + y : '+' + y ;
} ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 0 , [ 'YY' , 2 ] , 0 , function ( ) {
return this . year ( ) % 100 ;
} ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 0 , [ 'YYYY' , 4 ] , 0 , 'year' ) ;
addFormatToken ( 0 , [ 'YYYYY' , 5 ] , 0 , 'year' ) ;
addFormatToken ( 0 , [ 'YYYYYY' , 6 , true ] , 0 , 'year' ) ;
// ALIASES
addUnitAlias ( 'year' , 'y' ) ;
// PARSING
addRegexToken ( 'Y' , matchSigned ) ;
addRegexToken ( 'YY' , match1to2 , match2 ) ;
addRegexToken ( 'YYYY' , match1to4 , match4 ) ;
addRegexToken ( 'YYYYY' , match1to6 , match6 ) ;
addRegexToken ( 'YYYYYY' , match1to6 , match6 ) ;
addParseToken ( [ 'YYYYY' , 'YYYYYY' ] , YEAR ) ;
addParseToken ( 'YYYY' , function ( input , array ) {
array [ YEAR ] = input . length === 2 ? utils _hooks _ _hooks . parseTwoDigitYear ( input ) : toInt ( input ) ;
} ) ;
addParseToken ( 'YY' , function ( input , array ) {
array [ YEAR ] = utils _hooks _ _hooks . parseTwoDigitYear ( input ) ;
} ) ;
addParseToken ( 'Y' , function ( input , array ) {
array [ YEAR ] = parseInt ( input , 10 ) ;
} ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// HELPERS
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function daysInYear ( year ) {
return isLeapYear ( year ) ? 366 : 365 ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function isLeapYear ( year ) {
return ( year % 4 === 0 && year % 100 !== 0 ) || year % 400 === 0 ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
// HOOKS
utils _hooks _ _hooks . parseTwoDigitYear = function ( input ) {
return toInt ( input ) + ( toInt ( input ) > 68 ? 1900 : 2000 ) ;
} ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// MOMENTS
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var getSetYear = makeGetSet ( 'FullYear' , false ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function getIsLeapYear ( ) {
return isLeapYear ( this . year ( ) ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// start-of-first-week - start-of-year
function firstWeekOffset ( year , dow , doy ) {
var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
fwd = 7 + dow - doy ,
// first-week day local weekday -- which local weekday is fwd
fwdlw = ( 7 + createUTCDate ( year , 0 , fwd ) . getUTCDay ( ) - dow ) % 7 ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
return - fwdlw + fwd - 1 ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
//http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
function dayOfYearFromWeeks ( year , week , weekday , dow , doy ) {
var localWeekday = ( 7 + weekday - dow ) % 7 ,
weekOffset = firstWeekOffset ( year , dow , doy ) ,
dayOfYear = 1 + 7 * ( week - 1 ) + localWeekday + weekOffset ,
resYear , resDayOfYear ;
if ( dayOfYear <= 0 ) {
resYear = year - 1 ;
resDayOfYear = daysInYear ( resYear ) + dayOfYear ;
} else if ( dayOfYear > daysInYear ( year ) ) {
resYear = year + 1 ;
resDayOfYear = dayOfYear - daysInYear ( year ) ;
} else {
resYear = year ;
resDayOfYear = dayOfYear ;
2013-06-07 06:49:09 +08:00
}
return {
2016-04-01 05:33:25 +08:00
year : resYear ,
dayOfYear : resDayOfYear
2013-06-07 06:49:09 +08:00
} ;
}
2016-04-01 05:33:25 +08:00
function weekOfYear ( mom , dow , doy ) {
var weekOffset = firstWeekOffset ( mom . year ( ) , dow , doy ) ,
week = Math . floor ( ( mom . dayOfYear ( ) - weekOffset - 1 ) / 7 ) + 1 ,
resWeek , resYear ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
if ( week < 1 ) {
resYear = mom . year ( ) - 1 ;
resWeek = week + weeksInYear ( resYear , dow , doy ) ;
} else if ( week > weeksInYear ( mom . year ( ) , dow , doy ) ) {
resWeek = week - weeksInYear ( mom . year ( ) , dow , doy ) ;
resYear = mom . year ( ) + 1 ;
} else {
resYear = mom . year ( ) ;
resWeek = week ;
}
2014-08-21 02:41:50 +08:00
return {
2016-04-01 05:33:25 +08:00
week : resWeek ,
year : resYear
2014-08-21 02:41:50 +08:00
} ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function weeksInYear ( year , dow , doy ) {
var weekOffset = firstWeekOffset ( year , dow , doy ) ,
weekOffsetNext = firstWeekOffset ( year + 1 , dow , doy ) ;
return ( daysInYear ( year ) - weekOffset + weekOffsetNext ) / 7 ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// Pick the first defined of two or three arguments.
function defaults ( a , b , c ) {
if ( a != null ) {
return a ;
}
if ( b != null ) {
return b ;
}
return c ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function currentDateArray ( config ) {
// hooks is actually the exported moment object
var nowValue = new Date ( utils _hooks _ _hooks . now ( ) ) ;
if ( config . _useUTC ) {
return [ nowValue . getUTCFullYear ( ) , nowValue . getUTCMonth ( ) , nowValue . getUTCDate ( ) ] ;
}
return [ nowValue . getFullYear ( ) , nowValue . getMonth ( ) , nowValue . getDate ( ) ] ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// convert an array to a date.
// the array should mirror the parameters below
// note: all values past the year are optional and will default to the lowest possible value.
// [year, month, day , hour, minute, second, millisecond]
function configFromArray ( config ) {
var i , date , input = [ ] , currentDate , yearToUse ;
if ( config . _d ) {
return ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
currentDate = currentDateArray ( config ) ;
//compute day of the year from weeks and weekdays
if ( config . _w && config . _a [ DATE ] == null && config . _a [ MONTH ] == null ) {
dayOfYearFromWeekInfo ( config ) ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
//if the day of the year is set, figure out what it is
if ( config . _dayOfYear ) {
yearToUse = defaults ( config . _a [ YEAR ] , currentDate [ YEAR ] ) ;
if ( config . _dayOfYear > daysInYear ( yearToUse ) ) {
getParsingFlags ( config ) . _overflowDayOfYear = true ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
date = createUTCDate ( yearToUse , 0 , config . _dayOfYear ) ;
config . _a [ MONTH ] = date . getUTCMonth ( ) ;
config . _a [ DATE ] = date . getUTCDate ( ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// Default to current date.
// * if no year, month, day of month are given, default to today
// * if day of month is given, default month and year
// * if month is given, default only year
// * if year is given, don't default anything
for ( i = 0 ; i < 3 && config . _a [ i ] == null ; ++ i ) {
config . _a [ i ] = input [ i ] = currentDate [ i ] ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// Zero out whatever was not defaulted, including time
for ( ; i < 7 ; i ++ ) {
config . _a [ i ] = input [ i ] = ( config . _a [ i ] == null ) ? ( i === 2 ? 1 : 0 ) : config . _a [ i ] ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
// Check for 24:00:00.000
if ( config . _a [ HOUR ] === 24 &&
config . _a [ MINUTE ] === 0 &&
config . _a [ SECOND ] === 0 &&
config . _a [ MILLISECOND ] === 0 ) {
config . _nextDay = true ;
config . _a [ HOUR ] = 0 ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
config . _d = ( config . _useUTC ? createUTCDate : createDate ) . apply ( null , input ) ;
// Apply timezone offset from input. The actual utcOffset can be changed
// with parseZone.
if ( config . _tzm != null ) {
config . _d . setUTCMinutes ( config . _d . getUTCMinutes ( ) - config . _tzm ) ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
if ( config . _nextDay ) {
config . _a [ HOUR ] = 24 ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function dayOfYearFromWeekInfo ( config ) {
var w , weekYear , week , weekday , dow , doy , temp , weekdayOverflow ;
w = config . _w ;
if ( w . GG != null || w . W != null || w . E != null ) {
dow = 1 ;
doy = 4 ;
// TODO: We need to take the current isoWeekYear, but that depends on
// how we interpret now (local, utc, fixed offset). So create
// a now version of current config (take local/utc/offset flags, and
// create now).
weekYear = defaults ( w . GG , config . _a [ YEAR ] , weekOfYear ( local _ _createLocal ( ) , 1 , 4 ) . year ) ;
week = defaults ( w . W , 1 ) ;
weekday = defaults ( w . E , 1 ) ;
if ( weekday < 1 || weekday > 7 ) {
weekdayOverflow = true ;
}
} else {
dow = config . _locale . _week . dow ;
doy = config . _locale . _week . doy ;
weekYear = defaults ( w . gg , config . _a [ YEAR ] , weekOfYear ( local _ _createLocal ( ) , dow , doy ) . year ) ;
week = defaults ( w . w , 1 ) ;
if ( w . d != null ) {
// weekday -- low day numbers are considered next week
weekday = w . d ;
if ( weekday < 0 || weekday > 6 ) {
weekdayOverflow = true ;
}
} else if ( w . e != null ) {
// local weekday -- counting starts from begining of week
weekday = w . e + dow ;
if ( w . e < 0 || w . e > 6 ) {
weekdayOverflow = true ;
}
} else {
// default to begining of week
weekday = dow ;
}
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
if ( week < 1 || week > weeksInYear ( weekYear , dow , doy ) ) {
getParsingFlags ( config ) . _overflowWeeks = true ;
} else if ( weekdayOverflow != null ) {
getParsingFlags ( config ) . _overflowWeekday = true ;
} else {
temp = dayOfYearFromWeeks ( weekYear , week , weekday , dow , doy ) ;
config . _a [ YEAR ] = temp . year ;
config . _dayOfYear = temp . dayOfYear ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
}
// constant that refers to the ISO standard
utils _hooks _ _hooks . ISO _8601 = function ( ) { } ;
// date from string and format string
function configFromStringAndFormat ( config ) {
// TODO: Move this to another part of the creation flow to prevent circular deps
if ( config . _f === utils _hooks _ _hooks . ISO _8601 ) {
configFromISO ( config ) ;
return ;
}
config . _a = [ ] ;
getParsingFlags ( config ) . empty = true ;
// This array is used to make a Date, either with `new Date` or `Date.UTC`
var string = '' + config . _i ,
i , parsedInput , tokens , token , skipped ,
stringLength = string . length ,
totalParsedInputLength = 0 ;
tokens = expandFormat ( config . _f , config . _locale ) . match ( formattingTokens ) || [ ] ;
for ( i = 0 ; i < tokens . length ; i ++ ) {
token = tokens [ i ] ;
parsedInput = ( string . match ( getParseRegexForToken ( token , config ) ) || [ ] ) [ 0 ] ;
// console.log('token', token, 'parsedInput', parsedInput,
// 'regex', getParseRegexForToken(token, config));
if ( parsedInput ) {
skipped = string . substr ( 0 , string . indexOf ( parsedInput ) ) ;
if ( skipped . length > 0 ) {
getParsingFlags ( config ) . unusedInput . push ( skipped ) ;
}
string = string . slice ( string . indexOf ( parsedInput ) + parsedInput . length ) ;
totalParsedInputLength += parsedInput . length ;
}
// don't parse if it's not a known token
if ( formatTokenFunctions [ token ] ) {
if ( parsedInput ) {
getParsingFlags ( config ) . empty = false ;
}
else {
getParsingFlags ( config ) . unusedTokens . push ( token ) ;
}
addTimeToArrayFromToken ( token , parsedInput , config ) ;
}
else if ( config . _strict && ! parsedInput ) {
getParsingFlags ( config ) . unusedTokens . push ( token ) ;
}
}
// add remaining unparsed input length to the string
getParsingFlags ( config ) . charsLeftOver = stringLength - totalParsedInputLength ;
if ( string . length > 0 ) {
getParsingFlags ( config ) . unusedInput . push ( string ) ;
}
// clear _12h flag if hour is <= 12
if ( getParsingFlags ( config ) . bigHour === true &&
config . _a [ HOUR ] <= 12 &&
config . _a [ HOUR ] > 0 ) {
getParsingFlags ( config ) . bigHour = undefined ;
}
// handle meridiem
config . _a [ HOUR ] = meridiemFixWrap ( config . _locale , config . _a [ HOUR ] , config . _meridiem ) ;
configFromArray ( config ) ;
checkOverflow ( config ) ;
}
function meridiemFixWrap ( locale , hour , meridiem ) {
var isPm ;
if ( meridiem == null ) {
// nothing to do
return hour ;
}
if ( locale . meridiemHour != null ) {
return locale . meridiemHour ( hour , meridiem ) ;
} else if ( locale . isPM != null ) {
// Fallback
isPm = locale . isPM ( meridiem ) ;
if ( isPm && hour < 12 ) {
hour += 12 ;
}
if ( ! isPm && hour === 12 ) {
hour = 0 ;
}
return hour ;
} else {
// this is not supposed to happen
return hour ;
}
}
// date from string and array of format strings
function configFromStringAndArray ( config ) {
var tempConfig ,
bestMoment ,
scoreToBeat ,
i ,
currentScore ;
if ( config . _f . length === 0 ) {
getParsingFlags ( config ) . invalidFormat = true ;
config . _d = new Date ( NaN ) ;
return ;
}
for ( i = 0 ; i < config . _f . length ; i ++ ) {
currentScore = 0 ;
tempConfig = copyConfig ( { } , config ) ;
if ( config . _useUTC != null ) {
tempConfig . _useUTC = config . _useUTC ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
tempConfig . _f = config . _f [ i ] ;
configFromStringAndFormat ( tempConfig ) ;
if ( ! valid _ _isValid ( tempConfig ) ) {
continue ;
}
// if there is any input that was not parsed add a penalty for that format
currentScore += getParsingFlags ( tempConfig ) . charsLeftOver ;
//or tokens
currentScore += getParsingFlags ( tempConfig ) . unusedTokens . length * 10 ;
getParsingFlags ( tempConfig ) . score = currentScore ;
if ( scoreToBeat == null || currentScore < scoreToBeat ) {
scoreToBeat = currentScore ;
bestMoment = tempConfig ;
}
}
extend ( config , bestMoment || tempConfig ) ;
}
function configFromObject ( config ) {
if ( config . _d ) {
return ;
}
var i = normalizeObjectUnits ( config . _i ) ;
config . _a = map ( [ i . year , i . month , i . day || i . date , i . hour , i . minute , i . second , i . millisecond ] , function ( obj ) {
return obj && parseInt ( obj , 10 ) ;
} ) ;
configFromArray ( config ) ;
}
function createFromConfig ( config ) {
var res = new Moment ( checkOverflow ( prepareConfig ( config ) ) ) ;
if ( res . _nextDay ) {
// Adding is smart enough around DST
res . add ( 1 , 'd' ) ;
res . _nextDay = undefined ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
2014-08-21 02:41:50 +08:00
return res ;
}
2016-04-01 05:33:25 +08:00
function prepareConfig ( config ) {
var input = config . _i ,
format = config . _f ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
config . _locale = config . _locale || locale _locales _ _getLocale ( config . _l ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
if ( input === null || ( format === undefined && input === '' ) ) {
return valid _ _createInvalid ( { nullInput : true } ) ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
if ( typeof input === 'string' ) {
config . _i = input = config . _locale . preparse ( input ) ;
}
if ( isMoment ( input ) ) {
return new Moment ( checkOverflow ( input ) ) ;
} else if ( isArray ( format ) ) {
configFromStringAndArray ( config ) ;
} else if ( format ) {
configFromStringAndFormat ( config ) ;
} else if ( isDate ( input ) ) {
config . _d = input ;
} else {
configFromInput ( config ) ;
}
if ( ! valid _ _isValid ( config ) ) {
config . _d = null ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
return config ;
}
function configFromInput ( config ) {
var input = config . _i ;
if ( input === undefined ) {
config . _d = new Date ( utils _hooks _ _hooks . now ( ) ) ;
} else if ( isDate ( input ) ) {
config . _d = new Date ( + input ) ;
} else if ( typeof input === 'string' ) {
configFromString ( config ) ;
} else if ( isArray ( input ) ) {
config . _a = map ( input . slice ( 0 ) , function ( obj ) {
return parseInt ( obj , 10 ) ;
} ) ;
configFromArray ( config ) ;
} else if ( typeof ( input ) === 'object' ) {
configFromObject ( config ) ;
} else if ( typeof ( input ) === 'number' ) {
// from milliseconds
config . _d = new Date ( input ) ;
} else {
utils _hooks _ _hooks . createFromInputFallback ( config ) ;
}
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function createLocalOrUTC ( input , format , locale , strict , isUTC ) {
var c = { } ;
if ( typeof ( locale ) === 'boolean' ) {
2014-08-21 02:41:50 +08:00
strict = locale ;
locale = undefined ;
}
// object construction must be done this way.
// https://github.com/moment/moment/issues/1423
c . _isAMomentObject = true ;
2016-04-01 05:33:25 +08:00
c . _useUTC = c . _isUTC = isUTC ;
2014-08-21 02:41:50 +08:00
c . _l = locale ;
c . _i = input ;
c . _f = format ;
c . _strict = strict ;
2016-04-01 05:33:25 +08:00
return createFromConfig ( c ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function local _ _createLocal ( input , format , locale , strict ) {
return createLocalOrUTC ( input , format , locale , strict , false ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var prototypeMin = deprecate (
'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548' ,
function ( ) {
var other = local _ _createLocal . apply ( null , arguments ) ;
if ( this . isValid ( ) && other . isValid ( ) ) {
return other < this ? this : other ;
} else {
return valid _ _createInvalid ( ) ;
}
}
) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var prototypeMax = deprecate (
'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548' ,
function ( ) {
var other = local _ _createLocal . apply ( null , arguments ) ;
if ( this . isValid ( ) && other . isValid ( ) ) {
return other > this ? this : other ;
2013-06-07 06:49:09 +08:00
} else {
2016-04-01 05:33:25 +08:00
return valid _ _createInvalid ( ) ;
2013-06-07 06:49:09 +08:00
}
}
2016-04-01 05:33:25 +08:00
) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// Pick a moment m from moments so that m[fn](other) is true for all
// other. This relies on the function fn to be transitive.
//
// moments should either be an array of moment objects or an array, whose
// first element is an array of moment objects.
function pickBy ( fn , moments ) {
var res , i ;
if ( moments . length === 1 && isArray ( moments [ 0 ] ) ) {
moments = moments [ 0 ] ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
if ( ! moments . length ) {
return local _ _createLocal ( ) ;
}
res = moments [ 0 ] ;
for ( i = 1 ; i < moments . length ; ++ i ) {
if ( ! moments [ i ] . isValid ( ) || moments [ i ] [ fn ] ( res ) ) {
res = moments [ i ] ;
}
}
return res ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// TODO: Use [].sort instead?
function min ( ) {
var args = [ ] . slice . call ( arguments , 0 ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
return pickBy ( 'isBefore' , args ) ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function max ( ) {
var args = [ ] . slice . call ( arguments , 0 ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
return pickBy ( 'isAfter' , args ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var now = function ( ) {
return Date . now ? Date . now ( ) : + ( new Date ( ) ) ;
2014-08-21 02:41:50 +08:00
} ;
2016-04-01 05:33:25 +08:00
function Duration ( duration ) {
var normalizedInput = normalizeObjectUnits ( duration ) ,
years = normalizedInput . year || 0 ,
quarters = normalizedInput . quarter || 0 ,
months = normalizedInput . month || 0 ,
weeks = normalizedInput . week || 0 ,
days = normalizedInput . day || 0 ,
hours = normalizedInput . hour || 0 ,
minutes = normalizedInput . minute || 0 ,
seconds = normalizedInput . second || 0 ,
milliseconds = normalizedInput . millisecond || 0 ;
// representation for dateAddRemove
this . _milliseconds = + milliseconds +
seconds * 1e3 + // 1000
minutes * 6e4 + // 1000 * 60
hours * 36e5 ; // 1000 * 60 * 60
// Because of dateAddRemove treats 24 hours as different from a
// day when working around DST, we need to store them separately
this . _days = + days +
weeks * 7 ;
// It is impossible translate months into days without knowing
// which months you are are talking about, so we have to store
// it separately.
this . _months = + months +
quarters * 3 +
years * 12 ;
this . _data = { } ;
this . _locale = locale _locales _ _getLocale ( ) ;
this . _bubble ( ) ;
}
function isDuration ( obj ) {
return obj instanceof Duration ;
}
// FORMATTING
function offset ( token , separator ) {
addFormatToken ( token , 0 , 0 , function ( ) {
var offset = this . utcOffset ( ) ;
var sign = '+' ;
if ( offset < 0 ) {
offset = - offset ;
sign = '-' ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
return sign + zeroFill ( ~ ~ ( offset / 60 ) , 2 ) + separator + zeroFill ( ~ ~ ( offset ) % 60 , 2 ) ;
} ) ;
}
offset ( 'Z' , ':' ) ;
offset ( 'ZZ' , '' ) ;
// PARSING
addRegexToken ( 'Z' , matchShortOffset ) ;
addRegexToken ( 'ZZ' , matchShortOffset ) ;
addParseToken ( [ 'Z' , 'ZZ' ] , function ( input , array , config ) {
config . _useUTC = true ;
config . _tzm = offsetFromString ( matchShortOffset , input ) ;
} ) ;
// HELPERS
// timezone chunker
// '+10:00' > ['10', '00']
// '-1530' > ['-15', '30']
var chunkOffset = /([\+\-]|\d\d)/gi ;
function offsetFromString ( matcher , string ) {
var matches = ( ( string || '' ) . match ( matcher ) || [ ] ) ;
var chunk = matches [ matches . length - 1 ] || [ ] ;
var parts = ( chunk + '' ) . match ( chunkOffset ) || [ '-' , 0 , 0 ] ;
var minutes = + ( parts [ 1 ] * 60 ) + toInt ( parts [ 2 ] ) ;
return parts [ 0 ] === '+' ? minutes : - minutes ;
}
// Return a moment from input, that is local/utc/zone equivalent to model.
function cloneWithOffset ( input , model ) {
var res , diff ;
if ( model . _isUTC ) {
res = model . clone ( ) ;
diff = ( isMoment ( input ) || isDate ( input ) ? + input : + local _ _createLocal ( input ) ) - ( + res ) ;
// Use low-level api, because this fn is low-level api.
res . _d . setTime ( + res . _d + diff ) ;
utils _hooks _ _hooks . updateOffset ( res , false ) ;
return res ;
} else {
return local _ _createLocal ( input ) . local ( ) ;
}
}
function getDateOffset ( m ) {
// On Firefox.24 Date#getTimezoneOffset returns a floating point.
// https://github.com/moment/moment/pull/1871
return - Math . round ( m . _d . getTimezoneOffset ( ) / 15 ) * 15 ;
}
// HOOKS
// This function will be called whenever a moment is mutated.
// It is intended to keep the offset in sync with the timezone.
utils _hooks _ _hooks . updateOffset = function ( ) { } ;
// MOMENTS
// keepLocalTime = true means only change the timezone, without
// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
// +0200, so we adjust the time as needed, to be valid.
//
// Keeping the time actually adds/subtracts (one hour)
// from the actual represented time. That is why we call updateOffset
// a second time. In case it wants us to change the offset again
// _changeInProgress == true case, then we have to adjust, because
// there is no such time in the given timezone.
function getSetOffset ( input , keepLocalTime ) {
var offset = this . _offset || 0 ,
localAdjust ;
if ( ! this . isValid ( ) ) {
return input != null ? this : NaN ;
}
if ( input != null ) {
if ( typeof input === 'string' ) {
input = offsetFromString ( matchShortOffset , input ) ;
} else if ( Math . abs ( input ) < 16 ) {
input = input * 60 ;
}
if ( ! this . _isUTC && keepLocalTime ) {
localAdjust = getDateOffset ( this ) ;
}
this . _offset = input ;
this . _isUTC = true ;
if ( localAdjust != null ) {
this . add ( localAdjust , 'm' ) ;
}
if ( offset !== input ) {
if ( ! keepLocalTime || this . _changeInProgress ) {
add _subtract _ _addSubtract ( this , create _ _createDuration ( input - offset , 'm' ) , 1 , false ) ;
} else if ( ! this . _changeInProgress ) {
this . _changeInProgress = true ;
utils _hooks _ _hooks . updateOffset ( this , true ) ;
this . _changeInProgress = null ;
}
}
return this ;
} else {
return this . _isUTC ? offset : getDateOffset ( this ) ;
}
}
function getSetZone ( input , keepLocalTime ) {
if ( input != null ) {
if ( typeof input !== 'string' ) {
input = - input ;
}
this . utcOffset ( input , keepLocalTime ) ;
return this ;
} else {
return - this . utcOffset ( ) ;
}
}
function setOffsetToUTC ( keepLocalTime ) {
return this . utcOffset ( 0 , keepLocalTime ) ;
}
function setOffsetToLocal ( keepLocalTime ) {
if ( this . _isUTC ) {
this . utcOffset ( 0 , keepLocalTime ) ;
this . _isUTC = false ;
if ( keepLocalTime ) {
this . subtract ( getDateOffset ( this ) , 'm' ) ;
}
}
return this ;
}
function setOffsetToParsedOffset ( ) {
if ( this . _tzm ) {
this . utcOffset ( this . _tzm ) ;
} else if ( typeof this . _i === 'string' ) {
this . utcOffset ( offsetFromString ( matchOffset , this . _i ) ) ;
}
return this ;
}
function hasAlignedHourOffset ( input ) {
if ( ! this . isValid ( ) ) {
return false ;
}
input = input ? local _ _createLocal ( input ) . utcOffset ( ) : 0 ;
return ( this . utcOffset ( ) - input ) % 60 === 0 ;
}
function isDaylightSavingTime ( ) {
return (
this . utcOffset ( ) > this . clone ( ) . month ( 0 ) . utcOffset ( ) ||
this . utcOffset ( ) > this . clone ( ) . month ( 5 ) . utcOffset ( )
) ;
}
function isDaylightSavingTimeShifted ( ) {
if ( ! isUndefined ( this . _isDSTShifted ) ) {
return this . _isDSTShifted ;
}
var c = { } ;
copyConfig ( c , this ) ;
c = prepareConfig ( c ) ;
if ( c . _a ) {
var other = c . _isUTC ? create _utc _ _createUTC ( c . _a ) : local _ _createLocal ( c . _a ) ;
this . _isDSTShifted = this . isValid ( ) &&
compareArrays ( c . _a , other . toArray ( ) ) > 0 ;
} else {
this . _isDSTShifted = false ;
}
return this . _isDSTShifted ;
}
function isLocal ( ) {
return this . isValid ( ) ? ! this . _isUTC : false ;
}
function isUtcOffset ( ) {
return this . isValid ( ) ? this . _isUTC : false ;
}
function isUtc ( ) {
return this . isValid ( ) ? this . _isUTC && this . _offset === 0 : false ;
}
// ASP.NET json date format regex
var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/ ;
// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
var isoRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/ ;
function create _ _createDuration ( input , key ) {
var duration = input ,
// matching against regexp is expensive, do it on demand
match = null ,
sign ,
ret ,
diffRes ;
if ( isDuration ( input ) ) {
duration = {
ms : input . _milliseconds ,
d : input . _days ,
M : input . _months
} ;
} else if ( typeof input === 'number' ) {
duration = { } ;
if ( key ) {
duration [ key ] = input ;
} else {
duration . milliseconds = input ;
}
} else if ( ! ! ( match = aspNetRegex . exec ( input ) ) ) {
sign = ( match [ 1 ] === '-' ) ? - 1 : 1 ;
duration = {
y : 0 ,
d : toInt ( match [ DATE ] ) * sign ,
h : toInt ( match [ HOUR ] ) * sign ,
m : toInt ( match [ MINUTE ] ) * sign ,
s : toInt ( match [ SECOND ] ) * sign ,
ms : toInt ( match [ MILLISECOND ] ) * sign
} ;
} else if ( ! ! ( match = isoRegex . exec ( input ) ) ) {
sign = ( match [ 1 ] === '-' ) ? - 1 : 1 ;
duration = {
y : parseIso ( match [ 2 ] , sign ) ,
M : parseIso ( match [ 3 ] , sign ) ,
d : parseIso ( match [ 4 ] , sign ) ,
h : parseIso ( match [ 5 ] , sign ) ,
m : parseIso ( match [ 6 ] , sign ) ,
s : parseIso ( match [ 7 ] , sign ) ,
w : parseIso ( match [ 8 ] , sign )
} ;
} else if ( duration == null ) { // checks for null or undefined
duration = { } ;
} else if ( typeof duration === 'object' && ( 'from' in duration || 'to' in duration ) ) {
diffRes = momentsDifference ( local _ _createLocal ( duration . from ) , local _ _createLocal ( duration . to ) ) ;
duration = { } ;
duration . ms = diffRes . milliseconds ;
duration . M = diffRes . months ;
}
ret = new Duration ( duration ) ;
if ( isDuration ( input ) && hasOwnProp ( input , '_locale' ) ) {
ret . _locale = input . _locale ;
}
return ret ;
}
create _ _createDuration . fn = Duration . prototype ;
function parseIso ( inp , sign ) {
// We'd normally use ~~inp for this, but unfortunately it also
// converts floats to ints.
// inp may be undefined, so careful calling replace on it.
var res = inp && parseFloat ( inp . replace ( ',' , '.' ) ) ;
// apply sign while we're at it
return ( isNaN ( res ) ? 0 : res ) * sign ;
}
function positiveMomentsDifference ( base , other ) {
var res = { milliseconds : 0 , months : 0 } ;
res . months = other . month ( ) - base . month ( ) +
( other . year ( ) - base . year ( ) ) * 12 ;
if ( base . clone ( ) . add ( res . months , 'M' ) . isAfter ( other ) ) {
-- res . months ;
}
res . milliseconds = + other - + ( base . clone ( ) . add ( res . months , 'M' ) ) ;
return res ;
}
function momentsDifference ( base , other ) {
var res ;
if ( ! ( base . isValid ( ) && other . isValid ( ) ) ) {
return { milliseconds : 0 , months : 0 } ;
}
other = cloneWithOffset ( other , base ) ;
if ( base . isBefore ( other ) ) {
res = positiveMomentsDifference ( base , other ) ;
} else {
res = positiveMomentsDifference ( other , base ) ;
res . milliseconds = - res . milliseconds ;
res . months = - res . months ;
}
return res ;
}
// TODO: remove 'name' arg after deprecation is removed
function createAdder ( direction , name ) {
return function ( val , period ) {
var dur , tmp ;
//invert the arguments, but complain about it
if ( period !== null && ! isNaN ( + period ) ) {
deprecateSimple ( name , 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).' ) ;
tmp = val ; val = period ; period = tmp ;
}
val = typeof val === 'string' ? + val : val ;
dur = create _ _createDuration ( val , period ) ;
add _subtract _ _addSubtract ( this , dur , direction ) ;
return this ;
} ;
}
function add _subtract _ _addSubtract ( mom , duration , isAdding , updateOffset ) {
var milliseconds = duration . _milliseconds ,
days = duration . _days ,
months = duration . _months ;
if ( ! mom . isValid ( ) ) {
// No op
return ;
}
updateOffset = updateOffset == null ? true : updateOffset ;
if ( milliseconds ) {
mom . _d . setTime ( + mom . _d + milliseconds * isAdding ) ;
}
if ( days ) {
get _set _ _set ( mom , 'Date' , get _set _ _get ( mom , 'Date' ) + days * isAdding ) ;
}
if ( months ) {
setMonth ( mom , get _set _ _get ( mom , 'Month' ) + months * isAdding ) ;
}
if ( updateOffset ) {
utils _hooks _ _hooks . updateOffset ( mom , days || months ) ;
}
}
var add _subtract _ _add = createAdder ( 1 , 'add' ) ;
var add _subtract _ _subtract = createAdder ( - 1 , 'subtract' ) ;
function moment _calendar _ _calendar ( time , formats ) {
// We want to compare the start of today, vs this.
// Getting start-of-today depends on whether we're local/utc/offset or not.
var now = time || local _ _createLocal ( ) ,
sod = cloneWithOffset ( now , this ) . startOf ( 'day' ) ,
diff = this . diff ( sod , 'days' , true ) ,
format = diff < - 6 ? 'sameElse' :
diff < - 1 ? 'lastWeek' :
diff < 0 ? 'lastDay' :
diff < 1 ? 'sameDay' :
diff < 2 ? 'nextDay' :
diff < 7 ? 'nextWeek' : 'sameElse' ;
var output = formats && ( isFunction ( formats [ format ] ) ? formats [ format ] ( ) : formats [ format ] ) ;
return this . format ( output || this . localeData ( ) . calendar ( format , this , local _ _createLocal ( now ) ) ) ;
}
function clone ( ) {
return new Moment ( this ) ;
}
function isAfter ( input , units ) {
var localInput = isMoment ( input ) ? input : local _ _createLocal ( input ) ;
if ( ! ( this . isValid ( ) && localInput . isValid ( ) ) ) {
return false ;
}
units = normalizeUnits ( ! isUndefined ( units ) ? units : 'millisecond' ) ;
if ( units === 'millisecond' ) {
return + this > + localInput ;
} else {
return + localInput < + this . clone ( ) . startOf ( units ) ;
}
}
function isBefore ( input , units ) {
var localInput = isMoment ( input ) ? input : local _ _createLocal ( input ) ;
if ( ! ( this . isValid ( ) && localInput . isValid ( ) ) ) {
return false ;
}
units = normalizeUnits ( ! isUndefined ( units ) ? units : 'millisecond' ) ;
if ( units === 'millisecond' ) {
return + this < + localInput ;
} else {
return + this . clone ( ) . endOf ( units ) < + localInput ;
}
}
function isBetween ( from , to , units ) {
return this . isAfter ( from , units ) && this . isBefore ( to , units ) ;
}
function isSame ( input , units ) {
var localInput = isMoment ( input ) ? input : local _ _createLocal ( input ) ,
inputMs ;
if ( ! ( this . isValid ( ) && localInput . isValid ( ) ) ) {
return false ;
}
units = normalizeUnits ( units || 'millisecond' ) ;
if ( units === 'millisecond' ) {
return + this === + localInput ;
} else {
inputMs = + localInput ;
return + ( this . clone ( ) . startOf ( units ) ) <= inputMs && inputMs <= + ( this . clone ( ) . endOf ( units ) ) ;
}
}
function isSameOrAfter ( input , units ) {
return this . isSame ( input , units ) || this . isAfter ( input , units ) ;
}
function isSameOrBefore ( input , units ) {
return this . isSame ( input , units ) || this . isBefore ( input , units ) ;
}
function diff ( input , units , asFloat ) {
var that ,
zoneDelta ,
delta , output ;
if ( ! this . isValid ( ) ) {
return NaN ;
}
that = cloneWithOffset ( input , this ) ;
if ( ! that . isValid ( ) ) {
return NaN ;
}
zoneDelta = ( that . utcOffset ( ) - this . utcOffset ( ) ) * 6e4 ;
units = normalizeUnits ( units ) ;
if ( units === 'year' || units === 'month' || units === 'quarter' ) {
output = monthDiff ( this , that ) ;
if ( units === 'quarter' ) {
output = output / 3 ;
} else if ( units === 'year' ) {
output = output / 12 ;
}
} else {
delta = this - that ;
output = units === 'second' ? delta / 1e3 : // 1000
units === 'minute' ? delta / 6e4 : // 1000 * 60
units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60
units === 'day' ? ( delta - zoneDelta ) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
units === 'week' ? ( delta - zoneDelta ) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
delta ;
}
return asFloat ? output : absFloor ( output ) ;
}
function monthDiff ( a , b ) {
// difference in months
var wholeMonthDiff = ( ( b . year ( ) - a . year ( ) ) * 12 ) + ( b . month ( ) - a . month ( ) ) ,
// b is in (anchor - 1 month, anchor + 1 month)
anchor = a . clone ( ) . add ( wholeMonthDiff , 'months' ) ,
anchor2 , adjust ;
if ( b - anchor < 0 ) {
anchor2 = a . clone ( ) . add ( wholeMonthDiff - 1 , 'months' ) ;
// linear across the month
adjust = ( b - anchor ) / ( anchor - anchor2 ) ;
} else {
anchor2 = a . clone ( ) . add ( wholeMonthDiff + 1 , 'months' ) ;
// linear across the month
adjust = ( b - anchor ) / ( anchor2 - anchor ) ;
}
return - ( wholeMonthDiff + adjust ) ;
}
utils _hooks _ _hooks . defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ' ;
function toString ( ) {
return this . clone ( ) . locale ( 'en' ) . format ( 'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ' ) ;
}
function moment _format _ _toISOString ( ) {
var m = this . clone ( ) . utc ( ) ;
if ( 0 < m . year ( ) && m . year ( ) <= 9999 ) {
if ( isFunction ( Date . prototype . toISOString ) ) {
// native implementation is ~50x faster, use it when we can
return this . toDate ( ) . toISOString ( ) ;
} else {
return formatMoment ( m , 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' ) ;
}
} else {
return formatMoment ( m , 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' ) ;
}
}
function format ( inputString ) {
var output = formatMoment ( this , inputString || utils _hooks _ _hooks . defaultFormat ) ;
return this . localeData ( ) . postformat ( output ) ;
}
function from ( time , withoutSuffix ) {
if ( this . isValid ( ) &&
( ( isMoment ( time ) && time . isValid ( ) ) ||
local _ _createLocal ( time ) . isValid ( ) ) ) {
return create _ _createDuration ( { to : this , from : time } ) . locale ( this . locale ( ) ) . humanize ( ! withoutSuffix ) ;
} else {
return this . localeData ( ) . invalidDate ( ) ;
}
}
function fromNow ( withoutSuffix ) {
return this . from ( local _ _createLocal ( ) , withoutSuffix ) ;
}
function to ( time , withoutSuffix ) {
if ( this . isValid ( ) &&
( ( isMoment ( time ) && time . isValid ( ) ) ||
local _ _createLocal ( time ) . isValid ( ) ) ) {
return create _ _createDuration ( { from : this , to : time } ) . locale ( this . locale ( ) ) . humanize ( ! withoutSuffix ) ;
} else {
return this . localeData ( ) . invalidDate ( ) ;
}
}
function toNow ( withoutSuffix ) {
return this . to ( local _ _createLocal ( ) , withoutSuffix ) ;
}
// If passed a locale key, it will set the locale for this
// instance. Otherwise, it will return the locale configuration
// variables for this instance.
function locale ( key ) {
var newLocaleData ;
if ( key === undefined ) {
return this . _locale . _abbr ;
} else {
newLocaleData = locale _locales _ _getLocale ( key ) ;
if ( newLocaleData != null ) {
this . _locale = newLocaleData ;
}
return this ;
}
}
var lang = deprecate (
'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.' ,
function ( key ) {
if ( key === undefined ) {
return this . localeData ( ) ;
} else {
return this . locale ( key ) ;
}
}
) ;
function localeData ( ) {
return this . _locale ;
}
function startOf ( units ) {
units = normalizeUnits ( units ) ;
// the following switch intentionally omits break keywords
// to utilize falling through the cases.
switch ( units ) {
case 'year' :
this . month ( 0 ) ;
/* falls through */
case 'quarter' :
case 'month' :
this . date ( 1 ) ;
/* falls through */
case 'week' :
case 'isoWeek' :
case 'day' :
this . hours ( 0 ) ;
/* falls through */
case 'hour' :
this . minutes ( 0 ) ;
/* falls through */
case 'minute' :
this . seconds ( 0 ) ;
/* falls through */
case 'second' :
this . milliseconds ( 0 ) ;
}
// weeks are a special case
if ( units === 'week' ) {
this . weekday ( 0 ) ;
}
if ( units === 'isoWeek' ) {
this . isoWeekday ( 1 ) ;
}
// quarters are also special
if ( units === 'quarter' ) {
this . month ( Math . floor ( this . month ( ) / 3 ) * 3 ) ;
}
return this ;
}
function endOf ( units ) {
units = normalizeUnits ( units ) ;
if ( units === undefined || units === 'millisecond' ) {
return this ;
}
return this . startOf ( units ) . add ( 1 , ( units === 'isoWeek' ? 'week' : units ) ) . subtract ( 1 , 'ms' ) ;
}
function to _type _ _valueOf ( ) {
return + this . _d - ( ( this . _offset || 0 ) * 60000 ) ;
}
function unix ( ) {
return Math . floor ( + this / 1 0 0 0 ) ;
}
function toDate ( ) {
return this . _offset ? new Date ( + this ) : this . _d ;
}
function toArray ( ) {
var m = this ;
return [ m . year ( ) , m . month ( ) , m . date ( ) , m . hour ( ) , m . minute ( ) , m . second ( ) , m . millisecond ( ) ] ;
}
function toObject ( ) {
var m = this ;
return {
years : m . year ( ) ,
months : m . month ( ) ,
date : m . date ( ) ,
hours : m . hours ( ) ,
minutes : m . minutes ( ) ,
seconds : m . seconds ( ) ,
milliseconds : m . milliseconds ( )
} ;
}
function toJSON ( ) {
// JSON.stringify(new Date(NaN)) === 'null'
return this . isValid ( ) ? this . toISOString ( ) : 'null' ;
}
function moment _valid _ _isValid ( ) {
return valid _ _isValid ( this ) ;
}
function parsingFlags ( ) {
return extend ( { } , getParsingFlags ( this ) ) ;
}
function invalidAt ( ) {
return getParsingFlags ( this ) . overflow ;
}
function creationData ( ) {
return {
input : this . _i ,
format : this . _f ,
locale : this . _locale ,
isUTC : this . _isUTC ,
strict : this . _strict
} ;
}
// FORMATTING
addFormatToken ( 0 , [ 'gg' , 2 ] , 0 , function ( ) {
return this . weekYear ( ) % 100 ;
} ) ;
addFormatToken ( 0 , [ 'GG' , 2 ] , 0 , function ( ) {
return this . isoWeekYear ( ) % 100 ;
} ) ;
function addWeekYearFormatToken ( token , getter ) {
addFormatToken ( 0 , [ token , token . length ] , 0 , getter ) ;
}
addWeekYearFormatToken ( 'gggg' , 'weekYear' ) ;
addWeekYearFormatToken ( 'ggggg' , 'weekYear' ) ;
addWeekYearFormatToken ( 'GGGG' , 'isoWeekYear' ) ;
addWeekYearFormatToken ( 'GGGGG' , 'isoWeekYear' ) ;
// ALIASES
addUnitAlias ( 'weekYear' , 'gg' ) ;
addUnitAlias ( 'isoWeekYear' , 'GG' ) ;
// PARSING
addRegexToken ( 'G' , matchSigned ) ;
addRegexToken ( 'g' , matchSigned ) ;
addRegexToken ( 'GG' , match1to2 , match2 ) ;
addRegexToken ( 'gg' , match1to2 , match2 ) ;
addRegexToken ( 'GGGG' , match1to4 , match4 ) ;
addRegexToken ( 'gggg' , match1to4 , match4 ) ;
addRegexToken ( 'GGGGG' , match1to6 , match6 ) ;
addRegexToken ( 'ggggg' , match1to6 , match6 ) ;
addWeekParseToken ( [ 'gggg' , 'ggggg' , 'GGGG' , 'GGGGG' ] , function ( input , week , config , token ) {
week [ token . substr ( 0 , 2 ) ] = toInt ( input ) ;
} ) ;
addWeekParseToken ( [ 'gg' , 'GG' ] , function ( input , week , config , token ) {
week [ token ] = utils _hooks _ _hooks . parseTwoDigitYear ( input ) ;
} ) ;
// MOMENTS
function getSetWeekYear ( input ) {
return getSetWeekYearHelper . call ( this ,
input ,
this . week ( ) ,
this . weekday ( ) ,
this . localeData ( ) . _week . dow ,
this . localeData ( ) . _week . doy ) ;
}
function getSetISOWeekYear ( input ) {
return getSetWeekYearHelper . call ( this ,
input , this . isoWeek ( ) , this . isoWeekday ( ) , 1 , 4 ) ;
}
function getISOWeeksInYear ( ) {
return weeksInYear ( this . year ( ) , 1 , 4 ) ;
}
function getWeeksInYear ( ) {
var weekInfo = this . localeData ( ) . _week ;
return weeksInYear ( this . year ( ) , weekInfo . dow , weekInfo . doy ) ;
}
function getSetWeekYearHelper ( input , week , weekday , dow , doy ) {
var weeksTarget ;
if ( input == null ) {
return weekOfYear ( this , dow , doy ) . year ;
} else {
weeksTarget = weeksInYear ( input , dow , doy ) ;
if ( week > weeksTarget ) {
week = weeksTarget ;
}
return setWeekAll . call ( this , input , week , weekday , dow , doy ) ;
}
}
function setWeekAll ( weekYear , week , weekday , dow , doy ) {
var dayOfYearData = dayOfYearFromWeeks ( weekYear , week , weekday , dow , doy ) ,
date = createUTCDate ( dayOfYearData . year , 0 , dayOfYearData . dayOfYear ) ;
// console.log("got", weekYear, week, weekday, "set", date.toISOString());
this . year ( date . getUTCFullYear ( ) ) ;
this . month ( date . getUTCMonth ( ) ) ;
this . date ( date . getUTCDate ( ) ) ;
return this ;
}
// FORMATTING
addFormatToken ( 'Q' , 0 , 'Qo' , 'quarter' ) ;
// ALIASES
addUnitAlias ( 'quarter' , 'Q' ) ;
// PARSING
addRegexToken ( 'Q' , match1 ) ;
addParseToken ( 'Q' , function ( input , array ) {
array [ MONTH ] = ( toInt ( input ) - 1 ) * 3 ;
} ) ;
// MOMENTS
function getSetQuarter ( input ) {
return input == null ? Math . ceil ( ( this . month ( ) + 1 ) / 3 ) : this . month ( ( input - 1 ) * 3 + this . month ( ) % 3 ) ;
}
// FORMATTING
addFormatToken ( 'w' , [ 'ww' , 2 ] , 'wo' , 'week' ) ;
addFormatToken ( 'W' , [ 'WW' , 2 ] , 'Wo' , 'isoWeek' ) ;
// ALIASES
addUnitAlias ( 'week' , 'w' ) ;
addUnitAlias ( 'isoWeek' , 'W' ) ;
// PARSING
addRegexToken ( 'w' , match1to2 ) ;
addRegexToken ( 'ww' , match1to2 , match2 ) ;
addRegexToken ( 'W' , match1to2 ) ;
addRegexToken ( 'WW' , match1to2 , match2 ) ;
addWeekParseToken ( [ 'w' , 'ww' , 'W' , 'WW' ] , function ( input , week , config , token ) {
week [ token . substr ( 0 , 1 ) ] = toInt ( input ) ;
} ) ;
// HELPERS
// LOCALES
function localeWeek ( mom ) {
return weekOfYear ( mom , this . _week . dow , this . _week . doy ) . week ;
}
var defaultLocaleWeek = {
dow : 0 , // Sunday is the first day of the week.
doy : 6 // The week that contains Jan 1st is the first week of the year.
} ;
function localeFirstDayOfWeek ( ) {
return this . _week . dow ;
}
function localeFirstDayOfYear ( ) {
return this . _week . doy ;
}
// MOMENTS
function getSetWeek ( input ) {
var week = this . localeData ( ) . week ( this ) ;
return input == null ? week : this . add ( ( input - week ) * 7 , 'd' ) ;
}
function getSetISOWeek ( input ) {
var week = weekOfYear ( this , 1 , 4 ) . week ;
return input == null ? week : this . add ( ( input - week ) * 7 , 'd' ) ;
}
// FORMATTING
addFormatToken ( 'D' , [ 'DD' , 2 ] , 'Do' , 'date' ) ;
// ALIASES
addUnitAlias ( 'date' , 'D' ) ;
// PARSING
addRegexToken ( 'D' , match1to2 ) ;
addRegexToken ( 'DD' , match1to2 , match2 ) ;
addRegexToken ( 'Do' , function ( isStrict , locale ) {
return isStrict ? locale . _ordinalParse : locale . _ordinalParseLenient ;
} ) ;
addParseToken ( [ 'D' , 'DD' ] , DATE ) ;
addParseToken ( 'Do' , function ( input , array ) {
array [ DATE ] = toInt ( input . match ( match1to2 ) [ 0 ] , 10 ) ;
} ) ;
// MOMENTS
var getSetDayOfMonth = makeGetSet ( 'Date' , true ) ;
// FORMATTING
addFormatToken ( 'd' , 0 , 'do' , 'day' ) ;
addFormatToken ( 'dd' , 0 , 0 , function ( format ) {
return this . localeData ( ) . weekdaysMin ( this , format ) ;
} ) ;
addFormatToken ( 'ddd' , 0 , 0 , function ( format ) {
return this . localeData ( ) . weekdaysShort ( this , format ) ;
} ) ;
addFormatToken ( 'dddd' , 0 , 0 , function ( format ) {
return this . localeData ( ) . weekdays ( this , format ) ;
} ) ;
addFormatToken ( 'e' , 0 , 0 , 'weekday' ) ;
addFormatToken ( 'E' , 0 , 0 , 'isoWeekday' ) ;
// ALIASES
addUnitAlias ( 'day' , 'd' ) ;
addUnitAlias ( 'weekday' , 'e' ) ;
addUnitAlias ( 'isoWeekday' , 'E' ) ;
// PARSING
addRegexToken ( 'd' , match1to2 ) ;
addRegexToken ( 'e' , match1to2 ) ;
addRegexToken ( 'E' , match1to2 ) ;
addRegexToken ( 'dd' , matchWord ) ;
addRegexToken ( 'ddd' , matchWord ) ;
addRegexToken ( 'dddd' , matchWord ) ;
addWeekParseToken ( [ 'dd' , 'ddd' , 'dddd' ] , function ( input , week , config , token ) {
var weekday = config . _locale . weekdaysParse ( input , token , config . _strict ) ;
// if we didn't get a weekday name, mark the date as invalid
if ( weekday != null ) {
week . d = weekday ;
} else {
getParsingFlags ( config ) . invalidWeekday = input ;
}
} ) ;
addWeekParseToken ( [ 'd' , 'e' , 'E' ] , function ( input , week , config , token ) {
week [ token ] = toInt ( input ) ;
} ) ;
// HELPERS
function parseWeekday ( input , locale ) {
if ( typeof input !== 'string' ) {
return input ;
}
if ( ! isNaN ( input ) ) {
return parseInt ( input , 10 ) ;
}
input = locale . weekdaysParse ( input ) ;
if ( typeof input === 'number' ) {
return input ;
}
return null ;
}
// LOCALES
var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday' . split ( '_' ) ;
function localeWeekdays ( m , format ) {
return isArray ( this . _weekdays ) ? this . _weekdays [ m . day ( ) ] :
this . _weekdays [ this . _weekdays . isFormat . test ( format ) ? 'format' : 'standalone' ] [ m . day ( ) ] ;
}
var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat' . split ( '_' ) ;
function localeWeekdaysShort ( m ) {
return this . _weekdaysShort [ m . day ( ) ] ;
}
var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa' . split ( '_' ) ;
function localeWeekdaysMin ( m ) {
return this . _weekdaysMin [ m . day ( ) ] ;
}
function localeWeekdaysParse ( weekdayName , format , strict ) {
var i , mom , regex ;
if ( ! this . _weekdaysParse ) {
this . _weekdaysParse = [ ] ;
this . _minWeekdaysParse = [ ] ;
this . _shortWeekdaysParse = [ ] ;
this . _fullWeekdaysParse = [ ] ;
}
for ( i = 0 ; i < 7 ; i ++ ) {
// make the regex if we don't have it already
mom = local _ _createLocal ( [ 2000 , 1 ] ) . day ( i ) ;
if ( strict && ! this . _fullWeekdaysParse [ i ] ) {
this . _fullWeekdaysParse [ i ] = new RegExp ( '^' + this . weekdays ( mom , '' ) . replace ( '.' , '\.?' ) + '$' , 'i' ) ;
this . _shortWeekdaysParse [ i ] = new RegExp ( '^' + this . weekdaysShort ( mom , '' ) . replace ( '.' , '\.?' ) + '$' , 'i' ) ;
this . _minWeekdaysParse [ i ] = new RegExp ( '^' + this . weekdaysMin ( mom , '' ) . replace ( '.' , '\.?' ) + '$' , 'i' ) ;
}
if ( ! this . _weekdaysParse [ i ] ) {
regex = '^' + this . weekdays ( mom , '' ) + '|^' + this . weekdaysShort ( mom , '' ) + '|^' + this . weekdaysMin ( mom , '' ) ;
this . _weekdaysParse [ i ] = new RegExp ( regex . replace ( '.' , '' ) , 'i' ) ;
}
// test the regex
if ( strict && format === 'dddd' && this . _fullWeekdaysParse [ i ] . test ( weekdayName ) ) {
return i ;
} else if ( strict && format === 'ddd' && this . _shortWeekdaysParse [ i ] . test ( weekdayName ) ) {
return i ;
} else if ( strict && format === 'dd' && this . _minWeekdaysParse [ i ] . test ( weekdayName ) ) {
return i ;
} else if ( ! strict && this . _weekdaysParse [ i ] . test ( weekdayName ) ) {
return i ;
}
}
}
// MOMENTS
function getSetDayOfWeek ( input ) {
if ( ! this . isValid ( ) ) {
return input != null ? this : NaN ;
}
var day = this . _isUTC ? this . _d . getUTCDay ( ) : this . _d . getDay ( ) ;
if ( input != null ) {
input = parseWeekday ( input , this . localeData ( ) ) ;
return this . add ( input - day , 'd' ) ;
} else {
return day ;
}
}
function getSetLocaleDayOfWeek ( input ) {
if ( ! this . isValid ( ) ) {
return input != null ? this : NaN ;
}
var weekday = ( this . day ( ) + 7 - this . localeData ( ) . _week . dow ) % 7 ;
return input == null ? weekday : this . add ( input - weekday , 'd' ) ;
}
function getSetISODayOfWeek ( input ) {
if ( ! this . isValid ( ) ) {
return input != null ? this : NaN ;
}
// behaves the same as moment#day except
// as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
// as a setter, sunday should belong to the previous week.
return input == null ? this . day ( ) || 7 : this . day ( this . day ( ) % 7 ? input : input - 7 ) ;
}
// FORMATTING
addFormatToken ( 'DDD' , [ 'DDDD' , 3 ] , 'DDDo' , 'dayOfYear' ) ;
// ALIASES
addUnitAlias ( 'dayOfYear' , 'DDD' ) ;
// PARSING
addRegexToken ( 'DDD' , match1to3 ) ;
addRegexToken ( 'DDDD' , match3 ) ;
addParseToken ( [ 'DDD' , 'DDDD' ] , function ( input , array , config ) {
config . _dayOfYear = toInt ( input ) ;
} ) ;
// HELPERS
// MOMENTS
function getSetDayOfYear ( input ) {
var dayOfYear = Math . round ( ( this . clone ( ) . startOf ( 'day' ) - this . clone ( ) . startOf ( 'year' ) ) / 864e5 ) + 1 ;
return input == null ? dayOfYear : this . add ( ( input - dayOfYear ) , 'd' ) ;
}
// FORMATTING
function hFormat ( ) {
return this . hours ( ) % 12 || 12 ;
}
addFormatToken ( 'H' , [ 'HH' , 2 ] , 0 , 'hour' ) ;
addFormatToken ( 'h' , [ 'hh' , 2 ] , 0 , hFormat ) ;
addFormatToken ( 'hmm' , 0 , 0 , function ( ) {
return '' + hFormat . apply ( this ) + zeroFill ( this . minutes ( ) , 2 ) ;
} ) ;
addFormatToken ( 'hmmss' , 0 , 0 , function ( ) {
return '' + hFormat . apply ( this ) + zeroFill ( this . minutes ( ) , 2 ) +
zeroFill ( this . seconds ( ) , 2 ) ;
} ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 'Hmm' , 0 , 0 , function ( ) {
return '' + this . hours ( ) + zeroFill ( this . minutes ( ) , 2 ) ;
} ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 'Hmmss' , 0 , 0 , function ( ) {
return '' + this . hours ( ) + zeroFill ( this . minutes ( ) , 2 ) +
zeroFill ( this . seconds ( ) , 2 ) ;
} ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function meridiem ( token , lowercase ) {
addFormatToken ( token , 0 , 0 , function ( ) {
return this . localeData ( ) . meridiem ( this . hours ( ) , this . minutes ( ) , lowercase ) ;
} ) ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
meridiem ( 'a' , true ) ;
meridiem ( 'A' , false ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// ALIASES
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addUnitAlias ( 'hour' , 'h' ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// PARSING
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function matchMeridiem ( isStrict , locale ) {
return locale . _meridiemParse ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
addRegexToken ( 'a' , matchMeridiem ) ;
addRegexToken ( 'A' , matchMeridiem ) ;
addRegexToken ( 'H' , match1to2 ) ;
addRegexToken ( 'h' , match1to2 ) ;
addRegexToken ( 'HH' , match1to2 , match2 ) ;
addRegexToken ( 'hh' , match1to2 , match2 ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
addRegexToken ( 'hmm' , match3to4 ) ;
addRegexToken ( 'hmmss' , match5to6 ) ;
addRegexToken ( 'Hmm' , match3to4 ) ;
addRegexToken ( 'Hmmss' , match5to6 ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
addParseToken ( [ 'H' , 'HH' ] , HOUR ) ;
addParseToken ( [ 'a' , 'A' ] , function ( input , array , config ) {
config . _isPm = config . _locale . isPM ( input ) ;
config . _meridiem = input ;
} ) ;
addParseToken ( [ 'h' , 'hh' ] , function ( input , array , config ) {
array [ HOUR ] = toInt ( input ) ;
getParsingFlags ( config ) . bigHour = true ;
} ) ;
addParseToken ( 'hmm' , function ( input , array , config ) {
var pos = input . length - 2 ;
array [ HOUR ] = toInt ( input . substr ( 0 , pos ) ) ;
array [ MINUTE ] = toInt ( input . substr ( pos ) ) ;
getParsingFlags ( config ) . bigHour = true ;
} ) ;
addParseToken ( 'hmmss' , function ( input , array , config ) {
var pos1 = input . length - 4 ;
var pos2 = input . length - 2 ;
array [ HOUR ] = toInt ( input . substr ( 0 , pos1 ) ) ;
array [ MINUTE ] = toInt ( input . substr ( pos1 , 2 ) ) ;
array [ SECOND ] = toInt ( input . substr ( pos2 ) ) ;
getParsingFlags ( config ) . bigHour = true ;
} ) ;
addParseToken ( 'Hmm' , function ( input , array , config ) {
var pos = input . length - 2 ;
array [ HOUR ] = toInt ( input . substr ( 0 , pos ) ) ;
array [ MINUTE ] = toInt ( input . substr ( pos ) ) ;
} ) ;
addParseToken ( 'Hmmss' , function ( input , array , config ) {
var pos1 = input . length - 4 ;
var pos2 = input . length - 2 ;
array [ HOUR ] = toInt ( input . substr ( 0 , pos1 ) ) ;
array [ MINUTE ] = toInt ( input . substr ( pos1 , 2 ) ) ;
array [ SECOND ] = toInt ( input . substr ( pos2 ) ) ;
} ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// LOCALES
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function localeIsPM ( input ) {
// IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
// Using charAt should be more compatible.
return ( ( input + '' ) . toLowerCase ( ) . charAt ( 0 ) === 'p' ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i ;
function localeMeridiem ( hours , minutes , isLower ) {
if ( hours > 11 ) {
return isLower ? 'pm' : 'PM' ;
} else {
return isLower ? 'am' : 'AM' ;
}
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
// MOMENTS
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// Setting the hour should keep the time, because the user explicitly
// specified which hour he wants. So trying to maintain the same hour (in
// a new timezone) makes sense. Adding/subtracting hours does not follow
// this rule.
var getSetHour = makeGetSet ( 'Hours' , true ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// FORMATTING
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 'm' , [ 'mm' , 2 ] , 0 , 'minute' ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// ALIASES
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addUnitAlias ( 'minute' , 'm' ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// PARSING
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addRegexToken ( 'm' , match1to2 ) ;
addRegexToken ( 'mm' , match1to2 , match2 ) ;
addParseToken ( [ 'm' , 'mm' ] , MINUTE ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// MOMENTS
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var getSetMinute = makeGetSet ( 'Minutes' , false ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// FORMATTING
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 's' , [ 'ss' , 2 ] , 0 , 'second' ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// ALIASES
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addUnitAlias ( 'second' , 's' ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// PARSING
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
addRegexToken ( 's' , match1to2 ) ;
addRegexToken ( 'ss' , match1to2 , match2 ) ;
addParseToken ( [ 's' , 'ss' ] , SECOND ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// MOMENTS
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var getSetSecond = makeGetSet ( 'Seconds' , false ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// FORMATTING
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 'S' , 0 , 0 , function ( ) {
return ~ ~ ( this . millisecond ( ) / 100 ) ;
} ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 0 , [ 'SS' , 2 ] , 0 , function ( ) {
return ~ ~ ( this . millisecond ( ) / 10 ) ;
} ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 0 , [ 'SSS' , 3 ] , 0 , 'millisecond' ) ;
addFormatToken ( 0 , [ 'SSSS' , 4 ] , 0 , function ( ) {
return this . millisecond ( ) * 10 ;
} ) ;
addFormatToken ( 0 , [ 'SSSSS' , 5 ] , 0 , function ( ) {
return this . millisecond ( ) * 100 ;
} ) ;
addFormatToken ( 0 , [ 'SSSSSS' , 6 ] , 0 , function ( ) {
return this . millisecond ( ) * 1000 ;
} ) ;
addFormatToken ( 0 , [ 'SSSSSSS' , 7 ] , 0 , function ( ) {
return this . millisecond ( ) * 10000 ;
} ) ;
addFormatToken ( 0 , [ 'SSSSSSSS' , 8 ] , 0 , function ( ) {
return this . millisecond ( ) * 100000 ;
} ) ;
addFormatToken ( 0 , [ 'SSSSSSSSS' , 9 ] , 0 , function ( ) {
return this . millisecond ( ) * 1000000 ;
} ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// ALIASES
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
addUnitAlias ( 'millisecond' , 'ms' ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// PARSING
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addRegexToken ( 'S' , match1to3 , match1 ) ;
addRegexToken ( 'SS' , match1to3 , match2 ) ;
addRegexToken ( 'SSS' , match1to3 , match3 ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var token ;
for ( token = 'SSSS' ; token . length <= 9 ; token += 'S' ) {
addRegexToken ( token , matchUnsigned ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function parseMs ( input , array ) {
array [ MILLISECOND ] = toInt ( ( '0.' + input ) * 1000 ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
for ( token = 'S' ; token . length <= 9 ; token += 'S' ) {
addParseToken ( token , parseMs ) ;
}
// MOMENTS
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var getSetMillisecond = makeGetSet ( 'Milliseconds' , false ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// FORMATTING
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
addFormatToken ( 'z' , 0 , 0 , 'zoneAbbr' ) ;
addFormatToken ( 'zz' , 0 , 0 , 'zoneName' ) ;
// MOMENTS
function getZoneAbbr ( ) {
return this . _isUTC ? 'UTC' : '' ;
}
function getZoneName ( ) {
return this . _isUTC ? 'Coordinated Universal Time' : '' ;
}
var momentPrototype _ _proto = Moment . prototype ;
momentPrototype _ _proto . add = add _subtract _ _add ;
momentPrototype _ _proto . calendar = moment _calendar _ _calendar ;
momentPrototype _ _proto . clone = clone ;
momentPrototype _ _proto . diff = diff ;
momentPrototype _ _proto . endOf = endOf ;
momentPrototype _ _proto . format = format ;
momentPrototype _ _proto . from = from ;
momentPrototype _ _proto . fromNow = fromNow ;
momentPrototype _ _proto . to = to ;
momentPrototype _ _proto . toNow = toNow ;
momentPrototype _ _proto . get = getSet ;
momentPrototype _ _proto . invalidAt = invalidAt ;
momentPrototype _ _proto . isAfter = isAfter ;
momentPrototype _ _proto . isBefore = isBefore ;
momentPrototype _ _proto . isBetween = isBetween ;
momentPrototype _ _proto . isSame = isSame ;
momentPrototype _ _proto . isSameOrAfter = isSameOrAfter ;
momentPrototype _ _proto . isSameOrBefore = isSameOrBefore ;
momentPrototype _ _proto . isValid = moment _valid _ _isValid ;
momentPrototype _ _proto . lang = lang ;
momentPrototype _ _proto . locale = locale ;
momentPrototype _ _proto . localeData = localeData ;
momentPrototype _ _proto . max = prototypeMax ;
momentPrototype _ _proto . min = prototypeMin ;
momentPrototype _ _proto . parsingFlags = parsingFlags ;
momentPrototype _ _proto . set = getSet ;
momentPrototype _ _proto . startOf = startOf ;
momentPrototype _ _proto . subtract = add _subtract _ _subtract ;
momentPrototype _ _proto . toArray = toArray ;
momentPrototype _ _proto . toObject = toObject ;
momentPrototype _ _proto . toDate = toDate ;
momentPrototype _ _proto . toISOString = moment _format _ _toISOString ;
momentPrototype _ _proto . toJSON = toJSON ;
momentPrototype _ _proto . toString = toString ;
momentPrototype _ _proto . unix = unix ;
momentPrototype _ _proto . valueOf = to _type _ _valueOf ;
momentPrototype _ _proto . creationData = creationData ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// Year
momentPrototype _ _proto . year = getSetYear ;
momentPrototype _ _proto . isLeapYear = getIsLeapYear ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// Week Year
momentPrototype _ _proto . weekYear = getSetWeekYear ;
momentPrototype _ _proto . isoWeekYear = getSetISOWeekYear ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// Quarter
momentPrototype _ _proto . quarter = momentPrototype _ _proto . quarters = getSetQuarter ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// Month
momentPrototype _ _proto . month = getSetMonth ;
momentPrototype _ _proto . daysInMonth = getDaysInMonth ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// Week
momentPrototype _ _proto . week = momentPrototype _ _proto . weeks = getSetWeek ;
momentPrototype _ _proto . isoWeek = momentPrototype _ _proto . isoWeeks = getSetISOWeek ;
momentPrototype _ _proto . weeksInYear = getWeeksInYear ;
momentPrototype _ _proto . isoWeeksInYear = getISOWeeksInYear ;
// Day
momentPrototype _ _proto . date = getSetDayOfMonth ;
momentPrototype _ _proto . day = momentPrototype _ _proto . days = getSetDayOfWeek ;
momentPrototype _ _proto . weekday = getSetLocaleDayOfWeek ;
momentPrototype _ _proto . isoWeekday = getSetISODayOfWeek ;
momentPrototype _ _proto . dayOfYear = getSetDayOfYear ;
// Hour
momentPrototype _ _proto . hour = momentPrototype _ _proto . hours = getSetHour ;
// Minute
momentPrototype _ _proto . minute = momentPrototype _ _proto . minutes = getSetMinute ;
// Second
momentPrototype _ _proto . second = momentPrototype _ _proto . seconds = getSetSecond ;
// Millisecond
momentPrototype _ _proto . millisecond = momentPrototype _ _proto . milliseconds = getSetMillisecond ;
// Offset
momentPrototype _ _proto . utcOffset = getSetOffset ;
momentPrototype _ _proto . utc = setOffsetToUTC ;
momentPrototype _ _proto . local = setOffsetToLocal ;
momentPrototype _ _proto . parseZone = setOffsetToParsedOffset ;
momentPrototype _ _proto . hasAlignedHourOffset = hasAlignedHourOffset ;
momentPrototype _ _proto . isDST = isDaylightSavingTime ;
momentPrototype _ _proto . isDSTShifted = isDaylightSavingTimeShifted ;
momentPrototype _ _proto . isLocal = isLocal ;
momentPrototype _ _proto . isUtcOffset = isUtcOffset ;
momentPrototype _ _proto . isUtc = isUtc ;
momentPrototype _ _proto . isUTC = isUtc ;
// Timezone
momentPrototype _ _proto . zoneAbbr = getZoneAbbr ;
momentPrototype _ _proto . zoneName = getZoneName ;
// Deprecations
momentPrototype _ _proto . dates = deprecate ( 'dates accessor is deprecated. Use date instead.' , getSetDayOfMonth ) ;
momentPrototype _ _proto . months = deprecate ( 'months accessor is deprecated. Use month instead' , getSetMonth ) ;
momentPrototype _ _proto . years = deprecate ( 'years accessor is deprecated. Use year instead' , getSetYear ) ;
momentPrototype _ _proto . zone = deprecate ( 'moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779' , getSetZone ) ;
var momentPrototype = momentPrototype _ _proto ;
function moment _ _createUnix ( input ) {
return local _ _createLocal ( input * 1000 ) ;
}
function moment _ _createInZone ( ) {
return local _ _createLocal . apply ( null , arguments ) . parseZone ( ) ;
}
var defaultCalendar = {
sameDay : '[Today at] LT' ,
nextDay : '[Tomorrow at] LT' ,
nextWeek : 'dddd [at] LT' ,
lastDay : '[Yesterday at] LT' ,
lastWeek : '[Last] dddd [at] LT' ,
sameElse : 'L'
} ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function locale _calendar _ _calendar ( key , mom , now ) {
var output = this . _calendar [ key ] ;
return isFunction ( output ) ? output . call ( mom , now ) : output ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
var defaultLongDateFormat = {
LTS : 'h:mm:ss A' ,
LT : 'h:mm A' ,
L : 'MM/DD/YYYY' ,
LL : 'MMMM D, YYYY' ,
LLL : 'MMMM D, YYYY h:mm A' ,
LLLL : 'dddd, MMMM D, YYYY h:mm A'
} ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function longDateFormat ( key ) {
var format = this . _longDateFormat [ key ] ,
formatUpper = this . _longDateFormat [ key . toUpperCase ( ) ] ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
if ( format || ! formatUpper ) {
return format ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
this . _longDateFormat [ key ] = formatUpper . replace ( /MMMM|MM|DD|dddd/g , function ( val ) {
return val . slice ( 1 ) ;
} ) ;
return this . _longDateFormat [ key ] ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
var defaultInvalidDate = 'Invalid date' ;
function invalidDate ( ) {
return this . _invalidDate ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
var defaultOrdinal = '%d' ;
var defaultOrdinalParse = /\d{1,2}/ ;
function ordinal ( number ) {
return this . _ordinal . replace ( '%d' , number ) ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
function preParsePostFormat ( string ) {
return string ;
}
var defaultRelativeTime = {
future : 'in %s' ,
past : '%s ago' ,
s : 'a few seconds' ,
m : 'a minute' ,
mm : '%d minutes' ,
h : 'an hour' ,
hh : '%d hours' ,
d : 'a day' ,
dd : '%d days' ,
M : 'a month' ,
MM : '%d months' ,
y : 'a year' ,
yy : '%d years'
} ;
function relative _ _relativeTime ( number , withoutSuffix , string , isFuture ) {
var output = this . _relativeTime [ string ] ;
return ( isFunction ( output ) ) ?
output ( number , withoutSuffix , string , isFuture ) :
output . replace ( /%d/i , number ) ;
}
function pastFuture ( diff , output ) {
var format = this . _relativeTime [ diff > 0 ? 'future' : 'past' ] ;
return isFunction ( format ) ? format ( output ) : format . replace ( /%s/i , output ) ;
}
function locale _set _ _set ( config ) {
var prop , i ;
for ( i in config ) {
prop = config [ i ] ;
if ( isFunction ( prop ) ) {
this [ i ] = prop ;
2013-06-07 06:49:09 +08:00
} else {
2016-04-01 05:33:25 +08:00
this [ '_' + i ] = prop ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
}
// Lenient ordinal parsing accepts just a number in addition to
// number + (possibly) stuff coming from _ordinalParseLenient.
this . _ordinalParseLenient = new RegExp ( this . _ordinalParse . source + '|' + ( /\d{1,2}/ ) . source ) ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
var prototype _ _proto = Locale . prototype ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
prototype _ _proto . _calendar = defaultCalendar ;
prototype _ _proto . calendar = locale _calendar _ _calendar ;
prototype _ _proto . _longDateFormat = defaultLongDateFormat ;
prototype _ _proto . longDateFormat = longDateFormat ;
prototype _ _proto . _invalidDate = defaultInvalidDate ;
prototype _ _proto . invalidDate = invalidDate ;
prototype _ _proto . _ordinal = defaultOrdinal ;
prototype _ _proto . ordinal = ordinal ;
prototype _ _proto . _ordinalParse = defaultOrdinalParse ;
prototype _ _proto . preparse = preParsePostFormat ;
prototype _ _proto . postformat = preParsePostFormat ;
prototype _ _proto . _relativeTime = defaultRelativeTime ;
prototype _ _proto . relativeTime = relative _ _relativeTime ;
prototype _ _proto . pastFuture = pastFuture ;
prototype _ _proto . set = locale _set _ _set ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// Month
prototype _ _proto . months = localeMonths ;
prototype _ _proto . _months = defaultLocaleMonths ;
prototype _ _proto . monthsShort = localeMonthsShort ;
prototype _ _proto . _monthsShort = defaultLocaleMonthsShort ;
prototype _ _proto . monthsParse = localeMonthsParse ;
prototype _ _proto . _monthsRegex = defaultMonthsRegex ;
prototype _ _proto . monthsRegex = monthsRegex ;
prototype _ _proto . _monthsShortRegex = defaultMonthsShortRegex ;
prototype _ _proto . monthsShortRegex = monthsShortRegex ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// Week
prototype _ _proto . week = localeWeek ;
prototype _ _proto . _week = defaultLocaleWeek ;
prototype _ _proto . firstDayOfYear = localeFirstDayOfYear ;
prototype _ _proto . firstDayOfWeek = localeFirstDayOfWeek ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// Day of Week
prototype _ _proto . weekdays = localeWeekdays ;
prototype _ _proto . _weekdays = defaultLocaleWeekdays ;
prototype _ _proto . weekdaysMin = localeWeekdaysMin ;
prototype _ _proto . _weekdaysMin = defaultLocaleWeekdaysMin ;
prototype _ _proto . weekdaysShort = localeWeekdaysShort ;
prototype _ _proto . _weekdaysShort = defaultLocaleWeekdaysShort ;
prototype _ _proto . weekdaysParse = localeWeekdaysParse ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// Hours
prototype _ _proto . isPM = localeIsPM ;
prototype _ _proto . _meridiemParse = defaultLocaleMeridiemParse ;
prototype _ _proto . meridiem = localeMeridiem ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function lists _ _get ( format , index , field , setter ) {
var locale = locale _locales _ _getLocale ( ) ;
var utc = create _utc _ _createUTC ( ) . set ( setter , index ) ;
return locale [ field ] ( utc , format ) ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
function list ( format , index , field , count , setter ) {
if ( typeof format === 'number' ) {
index = format ;
format = undefined ;
}
format = format || '' ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
if ( index != null ) {
return lists _ _get ( format , index , field , setter ) ;
}
var i ;
var out = [ ] ;
for ( i = 0 ; i < count ; i ++ ) {
out [ i ] = lists _ _get ( format , i , field , setter ) ;
}
return out ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function lists _ _listMonths ( format , index ) {
return list ( format , index , 'months' , 12 , 'month' ) ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function lists _ _listMonthsShort ( format , index ) {
return list ( format , index , 'monthsShort' , 12 , 'month' ) ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function lists _ _listWeekdays ( format , index ) {
return list ( format , index , 'weekdays' , 7 , 'day' ) ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function lists _ _listWeekdaysShort ( format , index ) {
return list ( format , index , 'weekdaysShort' , 7 , 'day' ) ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function lists _ _listWeekdaysMin ( format , index ) {
return list ( format , index , 'weekdaysMin' , 7 , 'day' ) ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
locale _locales _ _getSetGlobalLocale ( 'en' , {
ordinalParse : /\d{1,2}(th|st|nd|rd)/ ,
ordinal : function ( number ) {
var b = number % 10 ,
output = ( toInt ( number % 100 / 10 ) === 1 ) ? 'th' :
( b === 1 ) ? 'st' :
( b === 2 ) ? 'nd' :
( b === 3 ) ? 'rd' : 'th' ;
return number + output ;
}
} ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// Side effect imports
utils _hooks _ _hooks . lang = deprecate ( 'moment.lang is deprecated. Use moment.locale instead.' , locale _locales _ _getSetGlobalLocale ) ;
utils _hooks _ _hooks . langData = deprecate ( 'moment.langData is deprecated. Use moment.localeData instead.' , locale _locales _ _getLocale ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
var mathAbs = Math . abs ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function duration _abs _ _abs ( ) {
var data = this . _data ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
this . _milliseconds = mathAbs ( this . _milliseconds ) ;
this . _days = mathAbs ( this . _days ) ;
this . _months = mathAbs ( this . _months ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
data . milliseconds = mathAbs ( data . milliseconds ) ;
data . seconds = mathAbs ( data . seconds ) ;
data . minutes = mathAbs ( data . minutes ) ;
data . hours = mathAbs ( data . hours ) ;
data . months = mathAbs ( data . months ) ;
data . years = mathAbs ( data . years ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
return this ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function duration _add _subtract _ _addSubtract ( duration , input , value , direction ) {
var other = create _ _createDuration ( input , value ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
duration . _milliseconds += direction * other . _milliseconds ;
duration . _days += direction * other . _days ;
duration . _months += direction * other . _months ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
return duration . _bubble ( ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// supports only 2.0-style add(1, 's') or add(duration)
function duration _add _subtract _ _add ( input , value ) {
return duration _add _subtract _ _addSubtract ( this , input , value , 1 ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// supports only 2.0-style subtract(1, 's') or subtract(duration)
function duration _add _subtract _ _subtract ( input , value ) {
return duration _add _subtract _ _addSubtract ( this , input , value , - 1 ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function absCeil ( number ) {
if ( number < 0 ) {
return Math . floor ( number ) ;
} else {
return Math . ceil ( number ) ;
}
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function bubble ( ) {
var milliseconds = this . _milliseconds ;
var days = this . _days ;
var months = this . _months ;
var data = this . _data ;
var seconds , minutes , hours , years , monthsFromDays ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// if we have a mix of positive and negative values, bubble down first
// check: https://github.com/moment/moment/issues/2166
if ( ! ( ( milliseconds >= 0 && days >= 0 && months >= 0 ) ||
( milliseconds <= 0 && days <= 0 && months <= 0 ) ) ) {
milliseconds += absCeil ( monthsToDays ( months ) + days ) * 864e5 ;
days = 0 ;
months = 0 ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// The following code bubbles up values, see the tests for
// examples of what that means.
data . milliseconds = milliseconds % 1000 ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
seconds = absFloor ( milliseconds / 1000 ) ;
data . seconds = seconds % 60 ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
minutes = absFloor ( seconds / 60 ) ;
data . minutes = minutes % 60 ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
hours = absFloor ( minutes / 60 ) ;
data . hours = hours % 24 ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
days += absFloor ( hours / 24 ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// convert days to months
monthsFromDays = absFloor ( daysToMonths ( days ) ) ;
months += monthsFromDays ;
days -= absCeil ( monthsToDays ( monthsFromDays ) ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// 12 months -> 1 year
years = absFloor ( months / 12 ) ;
months %= 12 ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
data . days = days ;
data . months = months ;
data . years = years ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
return this ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function daysToMonths ( days ) {
// 400 years have 146097 days (taking into account leap year rules)
// 400 years have 12 months === 4800
return days * 4800 / 146097 ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function monthsToDays ( months ) {
// the reverse of daysToMonths
return months * 146097 / 4800 ;
}
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
function as ( units ) {
var days ;
var months ;
var milliseconds = this . _milliseconds ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
units = normalizeUnits ( units ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
if ( units === 'month' || units === 'year' ) {
days = this . _days + milliseconds / 864e5 ;
months = this . _months + daysToMonths ( days ) ;
return units === 'month' ? months : months / 12 ;
} else {
// handle milliseconds separately because of floating point math errors (issue #1867)
days = this . _days + Math . round ( monthsToDays ( this . _months ) ) ;
switch ( units ) {
case 'week' : return days / 7 + milliseconds / 6048e5 ;
case 'day' : return days + milliseconds / 864e5 ;
case 'hour' : return days * 24 + milliseconds / 36e5 ;
case 'minute' : return days * 1440 + milliseconds / 6e4 ;
case 'second' : return days * 86400 + milliseconds / 1000 ;
// Math.floor prevents floating point math errors here
case 'millisecond' : return Math . floor ( days * 864e5 ) + milliseconds ;
default : throw new Error ( 'Unknown unit ' + units ) ;
}
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// TODO: Use this.as('ms')?
function duration _as _ _valueOf ( ) {
return (
this . _milliseconds +
this . _days * 864e5 +
( this . _months % 12 ) * 2592e6 +
toInt ( this . _months / 12 ) * 31536e6
) ;
}
function makeAs ( alias ) {
return function ( ) {
return this . as ( alias ) ;
2013-06-07 06:49:09 +08:00
} ;
}
2016-04-01 05:33:25 +08:00
var asMilliseconds = makeAs ( 'ms' ) ;
var asSeconds = makeAs ( 's' ) ;
var asMinutes = makeAs ( 'm' ) ;
var asHours = makeAs ( 'h' ) ;
var asDays = makeAs ( 'd' ) ;
var asWeeks = makeAs ( 'w' ) ;
var asMonths = makeAs ( 'M' ) ;
var asYears = makeAs ( 'y' ) ;
function duration _get _ _get ( units ) {
units = normalizeUnits ( units ) ;
return this [ units + 's' ] ( ) ;
2013-06-07 06:49:09 +08:00
}
2016-04-01 05:33:25 +08:00
function makeGetter ( name ) {
return function ( ) {
return this . _data [ name ] ;
} ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var milliseconds = makeGetter ( 'milliseconds' ) ;
var seconds = makeGetter ( 'seconds' ) ;
var minutes = makeGetter ( 'minutes' ) ;
var hours = makeGetter ( 'hours' ) ;
var days = makeGetter ( 'days' ) ;
var months = makeGetter ( 'months' ) ;
var years = makeGetter ( 'years' ) ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function weeks ( ) {
return absFloor ( this . days ( ) / 7 ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
var round = Math . round ;
var thresholds = {
s : 45 , // seconds to minute
m : 45 , // minutes to hour
h : 22 , // hours to day
d : 26 , // days to month
M : 11 // months to year
} ;
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
function substituteTimeAgo ( string , number , withoutSuffix , isFuture , locale ) {
return locale . relativeTime ( number || 1 , ! ! withoutSuffix , string , isFuture ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function duration _humanize _ _relativeTime ( posNegDuration , withoutSuffix , locale ) {
var duration = create _ _createDuration ( posNegDuration ) . abs ( ) ;
var seconds = round ( duration . as ( 's' ) ) ;
var minutes = round ( duration . as ( 'm' ) ) ;
var hours = round ( duration . as ( 'h' ) ) ;
var days = round ( duration . as ( 'd' ) ) ;
var months = round ( duration . as ( 'M' ) ) ;
var years = round ( duration . as ( 'y' ) ) ;
var a = seconds < thresholds . s && [ 's' , seconds ] ||
minutes <= 1 && [ 'm' ] ||
minutes < thresholds . m && [ 'mm' , minutes ] ||
hours <= 1 && [ 'h' ] ||
hours < thresholds . h && [ 'hh' , hours ] ||
days <= 1 && [ 'd' ] ||
days < thresholds . d && [ 'dd' , days ] ||
months <= 1 && [ 'M' ] ||
months < thresholds . M && [ 'MM' , months ] ||
years <= 1 && [ 'y' ] || [ 'yy' , years ] ;
a [ 2 ] = withoutSuffix ;
a [ 3 ] = + posNegDuration > 0 ;
a [ 4 ] = locale ;
return substituteTimeAgo . apply ( null , a ) ;
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
// This function allows you to set a threshold for relative time strings
function duration _humanize _ _getSetRelativeTimeThreshold ( threshold , limit ) {
if ( thresholds [ threshold ] === undefined ) {
return false ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
if ( limit === undefined ) {
return thresholds [ threshold ] ;
2014-08-21 02:41:50 +08:00
}
2016-04-01 05:33:25 +08:00
thresholds [ threshold ] = limit ;
return true ;
2014-08-21 02:41:50 +08:00
}
2013-06-07 06:49:09 +08:00
2016-04-01 05:33:25 +08:00
function humanize ( withSuffix ) {
var locale = this . localeData ( ) ;
var output = duration _humanize _ _relativeTime ( this , ! withSuffix , locale ) ;
if ( withSuffix ) {
output = locale . pastFuture ( + this , output ) ;
}
return locale . postformat ( output ) ;
}
var iso _string _ _abs = Math . abs ;
function iso _string _ _toISOString ( ) {
// for ISO strings we do not use the normal bubbling rules:
// * milliseconds bubble up until they become hours
// * days do not bubble at all
// * months bubble up until they become years
// This is because there is no context-free conversion between hours and days
// (think of clock changes)
// and also not between days and months (28-31 days per month)
var seconds = iso _string _ _abs ( this . _milliseconds ) / 1000 ;
var days = iso _string _ _abs ( this . _days ) ;
var months = iso _string _ _abs ( this . _months ) ;
var minutes , hours , years ;
// 3600 seconds -> 60 minutes -> 1 hour
minutes = absFloor ( seconds / 60 ) ;
hours = absFloor ( minutes / 60 ) ;
seconds %= 60 ;
minutes %= 60 ;
// 12 months -> 1 year
years = absFloor ( months / 12 ) ;
months %= 12 ;
// inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
var Y = years ;
var M = months ;
var D = days ;
var h = hours ;
var m = minutes ;
var s = seconds ;
var total = this . asSeconds ( ) ;
if ( ! total ) {
// this is the same as C#'s (Noda) and python (isodate)...
// but not other JS (goog.date)
return 'P0D' ;
}
return ( total < 0 ? '-' : '' ) +
'P' +
( Y ? Y + 'Y' : '' ) +
( M ? M + 'M' : '' ) +
( D ? D + 'D' : '' ) +
( ( h || m || s ) ? 'T' : '' ) +
( h ? h + 'H' : '' ) +
( m ? m + 'M' : '' ) +
( s ? s + 'S' : '' ) ;
}
var duration _prototype _ _proto = Duration . prototype ;
duration _prototype _ _proto . abs = duration _abs _ _abs ;
duration _prototype _ _proto . add = duration _add _subtract _ _add ;
duration _prototype _ _proto . subtract = duration _add _subtract _ _subtract ;
duration _prototype _ _proto . as = as ;
duration _prototype _ _proto . asMilliseconds = asMilliseconds ;
duration _prototype _ _proto . asSeconds = asSeconds ;
duration _prototype _ _proto . asMinutes = asMinutes ;
duration _prototype _ _proto . asHours = asHours ;
duration _prototype _ _proto . asDays = asDays ;
duration _prototype _ _proto . asWeeks = asWeeks ;
duration _prototype _ _proto . asMonths = asMonths ;
duration _prototype _ _proto . asYears = asYears ;
duration _prototype _ _proto . valueOf = duration _as _ _valueOf ;
duration _prototype _ _proto . _bubble = bubble ;
duration _prototype _ _proto . get = duration _get _ _get ;
duration _prototype _ _proto . milliseconds = milliseconds ;
duration _prototype _ _proto . seconds = seconds ;
duration _prototype _ _proto . minutes = minutes ;
duration _prototype _ _proto . hours = hours ;
duration _prototype _ _proto . days = days ;
duration _prototype _ _proto . weeks = weeks ;
duration _prototype _ _proto . months = months ;
duration _prototype _ _proto . years = years ;
duration _prototype _ _proto . humanize = humanize ;
duration _prototype _ _proto . toISOString = iso _string _ _toISOString ;
duration _prototype _ _proto . toString = iso _string _ _toISOString ;
duration _prototype _ _proto . toJSON = iso _string _ _toISOString ;
duration _prototype _ _proto . locale = locale ;
duration _prototype _ _proto . localeData = localeData ;
// Deprecations
duration _prototype _ _proto . toIsoString = deprecate ( 'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)' , iso _string _ _toISOString ) ;
duration _prototype _ _proto . lang = lang ;
// Side effect imports
// FORMATTING
addFormatToken ( 'X' , 0 , 0 , 'unix' ) ;
addFormatToken ( 'x' , 0 , 0 , 'valueOf' ) ;
// PARSING
addRegexToken ( 'x' , matchSigned ) ;
addRegexToken ( 'X' , matchTimestamp ) ;
addParseToken ( 'X' , function ( input , array , config ) {
config . _d = new Date ( parseFloat ( input , 10 ) * 1000 ) ;
} ) ;
addParseToken ( 'x' , function ( input , array , config ) {
config . _d = new Date ( toInt ( input ) ) ;
} ) ;
2014-08-21 02:41:50 +08:00
2016-04-01 05:33:25 +08:00
// Side effect imports
utils _hooks _ _hooks . version = '2.11.2' ;
setHookCallback ( local _ _createLocal ) ;
utils _hooks _ _hooks . fn = momentPrototype ;
utils _hooks _ _hooks . min = min ;
utils _hooks _ _hooks . max = max ;
utils _hooks _ _hooks . now = now ;
utils _hooks _ _hooks . utc = create _utc _ _createUTC ;
utils _hooks _ _hooks . unix = moment _ _createUnix ;
utils _hooks _ _hooks . months = lists _ _listMonths ;
utils _hooks _ _hooks . isDate = isDate ;
utils _hooks _ _hooks . locale = locale _locales _ _getSetGlobalLocale ;
utils _hooks _ _hooks . invalid = valid _ _createInvalid ;
utils _hooks _ _hooks . duration = create _ _createDuration ;
utils _hooks _ _hooks . isMoment = isMoment ;
utils _hooks _ _hooks . weekdays = lists _ _listWeekdays ;
utils _hooks _ _hooks . parseZone = moment _ _createInZone ;
utils _hooks _ _hooks . localeData = locale _locales _ _getLocale ;
utils _hooks _ _hooks . isDuration = isDuration ;
utils _hooks _ _hooks . monthsShort = lists _ _listMonthsShort ;
utils _hooks _ _hooks . weekdaysMin = lists _ _listWeekdaysMin ;
utils _hooks _ _hooks . defineLocale = defineLocale ;
utils _hooks _ _hooks . weekdaysShort = lists _ _listWeekdaysShort ;
utils _hooks _ _hooks . normalizeUnits = normalizeUnits ;
utils _hooks _ _hooks . relativeTimeThreshold = duration _humanize _ _getSetRelativeTimeThreshold ;
utils _hooks _ _hooks . prototype = momentPrototype ;
var _moment = utils _hooks _ _hooks ;
return _moment ;
} ) ) ;