@ -1,5 +1,5 @@
//! moment.js
//! version : 2.8. 3
//! version : 2.8. 4
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
//! license : MIT
//! momentjs.com
@ -10,7 +10,7 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
var moment ,
VERSION = '2.8. 3 ',
VERSION = '2.8. 4 ',
// the global-scope this is NOT the global object in Node.js
globalScope = typeof global !== 'undefined' ? global : this ,
oldGlobalMoment ,
@ -33,7 +33,7 @@
momentProperties = [ ] ,
// check for nodeJS
hasModule = ( typeof module !== 'undefined' && module . exports ) ,
hasModule = ( typeof module !== 'undefined' && module && module . exports ) ,
// ASP.NET json date format regex
aspNetJsonRegex = /^\/?Date\((\-?\d+)/i ,
@ -44,8 +44,8 @@
isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/ ,
// format tokens
formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}| X|zz?|ZZ?|.)/g,
localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT |LL?L?L?|l{1,4})/g,
formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}| x| X|zz?|ZZ?|.)/g,
localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT S|LT |LL?L?L?|l{1,4})/g,
// parsing token regexes
parseTokenOneOrTwoDigits = /\d\d?/ , // 0 - 99
@ -56,8 +56,8 @@
parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i , // any word (or two) characters or numbers including two/three word month in arabic.
parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi , // +00:00 -00:00 +0000 -0000 or Z
parseTokenT = /T/i , // T (ISO separator)
parseTokenOffsetMs = /[\+\-]?\d+/ , // 1234567890123
parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/ , // 123456789 123456789.123
parseTokenOrdinal = /\d{1,2}/ ,
//strict parsing regexes
parseTokenOneDigit = /\d/ , // 0 - 9
@ -272,6 +272,9 @@
zz : function ( ) {
return this . zoneName ( ) ;
} ,
x : function ( ) {
return this . valueOf ( ) ;
} ,
X : function ( ) {
return this . unix ( ) ;
} ,
@ -698,7 +701,10 @@
overflow =
m . _a [ MONTH ] < 0 || m . _a [ MONTH ] > 11 ? MONTH :
m . _a [ DATE ] < 1 || m . _a [ DATE ] > daysInMonth ( m . _a [ YEAR ] , m . _a [ MONTH ] ) ? DATE :
m . _a [ HOUR ] < 0 || m . _a [ HOUR ] > 23 ? HOUR :
m . _a [ HOUR ] < 0 || m . _a [ HOUR ] > 24 ||
( m . _a [ HOUR ] === 24 && ( m . _a [ MINUTE ] !== 0 ||
m . _a [ SECOND ] !== 0 ||
m . _a [ MILLISECOND ] !== 0 ) ) ? HOUR :
m . _a [ MINUTE ] < 0 || m . _a [ MINUTE ] > 59 ? MINUTE :
m . _a [ SECOND ] < 0 || m . _a [ SECOND ] > 59 ? SECOND :
m . _a [ MILLISECOND ] < 0 || m . _a [ MILLISECOND ] > 999 ? MILLISECOND :
@ -725,7 +731,8 @@
if ( m . _strict ) {
m . _isValid = m . _isValid &&
m . _pf . charsLeftOver === 0 &&
m . _pf . unusedTokens . length === 0 ;
m . _pf . unusedTokens . length === 0 &&
m . _pf . bigHour === undefined ;
}
}
return m . _isValid ;
@ -777,8 +784,18 @@
// Return a moment from input, that is local/utc/zone equivalent to model.
function makeAs ( input , model ) {
return model . _isUTC ? moment ( input ) . zone ( model . _offset || 0 ) :
moment ( input ) . local ( ) ;
var res , diff ;
if ( model . _isUTC ) {
res = model . clone ( ) ;
diff = ( moment . isMoment ( input ) || isDate ( input ) ?
+ input : + moment ( input ) ) - ( + res ) ;
// Use low-level api, because this fn is low-level api.
res . _d . setTime ( + res . _d + diff ) ;
moment . updateOffset ( res , false ) ;
return res ;
} else {
return moment ( input ) . local ( ) ;
}
}
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@ -798,6 +815,9 @@
this [ '_' + i ] = prop ;
}
}
// 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 ) ;
} ,
_months : 'January_February_March_April_May_June_July_August_September_October_November_December' . split ( '_' ) ,
@ -810,22 +830,32 @@
return this . _monthsShort [ m . month ( ) ] ;
} ,
monthsParse : function ( monthName ) {
monthsParse : function ( monthName , format , strict ) {
var i , mom , regex ;
if ( ! this . _monthsParse ) {
this . _monthsParse = [ ] ;
this . _longMonthsParse = [ ] ;
this . _shortMonthsParse = [ ] ;
}
for ( i = 0 ; i < 12 ; i ++ ) {
// make the regex if we don't have it already
if ( ! this . _monthsParse [ i ] ) {
mom = moment . utc ( [ 2000 , i ] ) ;
mom = moment . utc ( [ 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 ( this . _monthsParse [ i ] . test ( monthName ) ) {
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 ;
}
}
@ -868,6 +898,7 @@
} ,
_longDateFormat : {
LTS : 'h:mm:ss A' ,
LT : 'h:mm A' ,
L : 'MM/DD/YYYY' ,
LL : 'MMMM D, YYYY' ,
@ -908,9 +939,9 @@
lastWeek : '[Last] dddd [at] LT' ,
sameElse : 'L'
} ,
calendar : function ( key , mom ) {
calendar : function ( key , mom , now ) {
var output = this . _calendar [ key ] ;
return typeof output === 'function' ? output . apply ( mom ) : output ;
return typeof output === 'function' ? output . apply ( mom , [ now ] ) : output ;
} ,
_relativeTime : {
@ -945,6 +976,7 @@
return this . _ordinal . replace ( '%d' , number ) ;
} ,
_ordinal : '%d' ,
_ordinalParse : /\d{1,2}/ ,
preparse : function ( string ) {
return string ;
@ -1086,6 +1118,8 @@
case 'a' :
case 'A' :
return config . _locale . _meridiemParse ;
case 'x' :
return parseTokenOffsetMs ;
case 'X' :
return parseTokenTimestampMs ;
case 'Z' :
@ -1120,7 +1154,7 @@
case 'E' :
return parseTokenOneOrTwoDigits ;
case 'Do' :
return parseTokenOrdinal ;
return strict ? config . _locale . _ordinalParse : config . _locale . _ordinalParseLenient ;
default :
a = new RegExp ( regexpEscape ( unescapeFormat ( token . replace ( '\\' , '' ) ) , 'i' ) ) ;
return a ;
@ -1157,7 +1191,7 @@
break ;
case 'MMM' : // fall through to MMMM
case 'MMMM' :
a = config . _locale . monthsParse ( input );
a = config . _locale . monthsParse ( input , token , config . _strict );
// if we didn't find a month name, mark the date as invalid.
if ( a != null ) {
datePartArray [ MONTH ] = a ;
@ -1174,7 +1208,8 @@
break ;
case 'Do' :
if ( input != null ) {
datePartArray [ DATE ] = toInt ( parseInt ( input , 10 ) ) ;
datePartArray [ DATE ] = toInt ( parseInt (
input . match ( /\d{1,2}/ ) [ 0 ] , 10 ) ) ;
}
break ;
// DAY OF YEAR
@ -1199,11 +1234,13 @@
case 'A' :
config . _isPm = config . _locale . isPM ( input ) ;
break ;
// 24 HOUR
case 'H' : // fall through to hh
case 'HH' : // fall through to hh
// HOUR
case 'h' : // fall through to hh
case 'hh' :
config . _pf . bigHour = true ;
/* falls through */
case 'H' : // fall through to HH
case 'HH' :
datePartArray [ HOUR ] = toInt ( input ) ;
break ;
// MINUTE
@ -1223,6 +1260,10 @@
case 'SSSS' :
datePartArray [ MILLISECOND ] = toInt ( ( '0.' + input ) * 1000 ) ;
break ;
// UNIX OFFSET (MILLISECONDS)
case 'x' :
config . _d = new Date ( toInt ( input ) ) ;
break ;
// UNIX TIMESTAMP WITH MS
case 'X' :
config . _d = new Date ( parseFloat ( input ) * 1000 ) ;
@ -1359,12 +1400,25 @@
config . _a [ i ] = input [ i ] = ( config . _a [ i ] == null ) ? ( i === 2 ? 1 : 0 ) : config . _a [ i ] ;
}
// 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 ;
}
config . _d = ( config . _useUTC ? makeUTCDate : makeDate ) . apply ( null , input ) ;
// Apply timezone offset from input. The actual zone can be changed
// with parseZone.
if ( config . _tzm != null ) {
config . _d . setUTCMinutes ( config . _d . getUTCMinutes ( ) + config . _tzm ) ;
}
if ( config . _nextDay ) {
config . _a [ HOUR ] = 24 ;
}
}
function dateFromObject ( config ) {
@ -1378,7 +1432,7 @@
config . _a = [
normalizedInput . year ,
normalizedInput . month ,
normalizedInput . day ,
normalizedInput . day || normalizedInput . date ,
normalizedInput . hour ,
normalizedInput . minute ,
normalizedInput . second ,
@ -1451,6 +1505,10 @@
config . _pf . unusedInput . push ( string ) ;
}
// clear _12h flag if hour is <= 12
if ( config . _pf . bigHour === true && config . _a [ HOUR ] <= 12 ) {
config . _pf . bigHour = undefined ;
}
// handle am pm
if ( config . _isPm && config . _a [ HOUR ] < 12 ) {
config . _a [ HOUR ] += 12 ;
@ -1459,7 +1517,6 @@
if ( config . _isPm === false && config . _a [ HOUR ] === 12 ) {
config . _a [ HOUR ] = 0 ;
}
dateFromConfig ( config ) ;
checkOverflow ( config ) ;
}
@ -1719,7 +1776,8 @@
function makeMoment ( config ) {
var input = config . _i ,
format = config . _f ;
format = config . _f ,
res ;
config . _locale = config . _locale || moment . localeData ( config . _l ) ;
@ -1743,7 +1801,14 @@
makeDateFromInput ( config ) ;
}
return new Moment ( config ) ;
res = new Moment ( config ) ;
if ( res . _nextDay ) {
// Adding is smart enough around DST
res . add ( 1 , 'd' ) ;
res . _nextDay = undefined ;
}
return res ;
}
moment = function ( input , format , locale , strict ) {
@ -1775,7 +1840,7 @@
'release. Please refer to ' +
'https://github.com/moment/moment/issues/1407 for more info.' ,
function ( config ) {
config . _d = new Date ( config . _i ) ;
config . _d = new Date ( config . _i + ( config . _useUTC ? ' UTC' : '' ) ) ;
}
) ;
@ -2087,7 +2152,12 @@
toISOString : function ( ) {
var m = moment ( this ) . utc ( ) ;
if ( 0 < m . year ( ) && m . year ( ) <= 9999 ) {
return formatMoment ( m , 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' ) ;
if ( 'function' === typeof 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]' ) ;
}
@ -2206,7 +2276,7 @@
diff < 1 ? 'sameDay' :
diff < 2 ? 'nextDay' :
diff < 7 ? 'nextWeek' : 'sameElse' ;
return this . format ( this . localeData ( ) . calendar ( format , this )) ;
return this . format ( this . localeData ( ) . calendar ( format , this , moment ( now ) )) ;
} ,
isLeapYear : function ( ) {
@ -2275,36 +2345,45 @@
endOf : function ( units ) {
units = normalizeUnits ( units ) ;
if ( units === undefined || units === 'millisecond' ) {
return this ;
}
return this . startOf ( units ) . add ( 1 , ( units === 'isoWeek' ? 'week' : units ) ) . subtract ( 1 , 'ms' ) ;
} ,
isAfter : function ( input , units ) {
var inputMs ;
units = normalizeUnits ( typeof units !== 'undefined' ? units : 'millisecond' ) ;
if ( units === 'millisecond' ) {
input = moment . isMoment ( input ) ? input : moment ( input ) ;
return + this > + input ;
} else {
return + this . clone ( ) . startOf ( units ) > + moment ( input ) . startOf ( units ) ;
inputMs = moment . isMoment ( input ) ? + input : + moment ( input ) ;
return inputMs < + this . clone ( ) . startOf ( units ) ;
}
} ,
isBefore : function ( input , units ) {
var inputMs ;
units = normalizeUnits ( typeof units !== 'undefined' ? units : 'millisecond' ) ;
if ( units === 'millisecond' ) {
input = moment . isMoment ( input ) ? input : moment ( input ) ;
return + this < + input ;
} else {
return + this . clone ( ) . startOf ( units ) < + moment ( input ) . startOf ( units ) ;
inputMs = moment . isMoment ( input ) ? + input : + moment ( input ) ;
return + this . clone ( ) . endOf ( units ) < inputMs ;
}
} ,
isSame : function ( input , units ) {
var inputMs ;
units = normalizeUnits ( units || 'millisecond' ) ;
if ( units === 'millisecond' ) {
input = moment . isMoment ( input ) ? input : moment ( input ) ;
return + this === + input ;
} else {
return + this . clone ( ) . startOf ( units ) === + makeAs ( input , this ) . startOf ( units ) ;
inputMs = + moment ( input ) ;
return + ( this . clone ( ) . startOf ( units ) ) <= inputMs && inputMs <= + ( this . clone ( ) . endOf ( units ) ) ;
}
} ,
@ -2481,7 +2560,7 @@
} ,
lang : deprecate (
'moment().lang() is deprecated. Use moment().localeData() instead .',
'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 ( ) ;
@ -2702,7 +2781,7 @@
return units === 'month' ? months : months / 12 ;
} else {
// handle milliseconds separately because of floating point math errors (issue #1867)
days = this . _days + yearsToDays ( this . _months / 12 ) ;
days = this . _days + Math . round ( yearsToDays ( this . _months / 12 ) ) ;
switch ( units ) {
case 'week' : return days / 7 + this . _milliseconds / 6048e5 ;
case 'day' : return days + this . _milliseconds / 864e5 ;
@ -2804,6 +2883,7 @@
// Set default locale, other locale will inherit from English.
moment . locale ( 'en' , {
ordinalParse : /\d{1,2}(th|st|nd|rd)/ ,
ordinal : function ( number ) {
var b = number % 10 ,
output = ( toInt ( number % 100 / 10 ) === 1 ) ? 'th' :