momentjs-rails 1.6.2 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -1
- data/changelog.md +4 -0
- data/vendor/assets/javascripts/moment.js +407 -219
- data/vendor/assets/javascripts/moment/bg.js +66 -0
- data/vendor/assets/javascripts/moment/ca.js +5 -1
- data/vendor/assets/javascripts/moment/cv.js +54 -0
- data/vendor/assets/javascripts/moment/da.js +6 -2
- data/vendor/assets/javascripts/moment/de.js +5 -1
- data/vendor/assets/javascripts/moment/en-ca.js +58 -0
- data/vendor/assets/javascripts/moment/en-gb.js +5 -1
- data/vendor/assets/javascripts/moment/es.js +5 -1
- data/vendor/assets/javascripts/moment/eu.js +5 -1
- data/vendor/assets/javascripts/moment/fi.js +6 -2
- data/vendor/assets/javascripts/moment/fr-ca.js +54 -0
- data/vendor/assets/javascripts/moment/fr.js +5 -1
- data/vendor/assets/javascripts/moment/gl.js +5 -1
- data/vendor/assets/javascripts/moment/hu.js +108 -0
- data/vendor/assets/javascripts/moment/is.js +5 -1
- data/vendor/assets/javascripts/moment/it.js +8 -4
- data/vendor/assets/javascripts/moment/ja.js +61 -0
- data/vendor/assets/javascripts/moment/jp.js +12 -5
- data/vendor/assets/javascripts/moment/ko.js +58 -0
- data/vendor/assets/javascripts/moment/kr.js +9 -2
- data/vendor/assets/javascripts/moment/nb.js +5 -1
- data/vendor/assets/javascripts/moment/nl.js +15 -3
- data/vendor/assets/javascripts/moment/pl.js +5 -1
- data/vendor/assets/javascripts/moment/pt-br.js +58 -0
- data/vendor/assets/javascripts/moment/pt.js +6 -2
- data/vendor/assets/javascripts/moment/ru.js +38 -8
- data/vendor/assets/javascripts/moment/sv.js +5 -1
- data/vendor/assets/javascripts/moment/tr.js +40 -6
- data/vendor/assets/javascripts/moment/zh-cn.js +6 -2
- data/vendor/assets/javascripts/moment/zh-tw.js +5 -1
- metadata +12 -4
data/README.md
CHANGED
@@ -24,7 +24,7 @@ If you want to include a localization file, also add the following directive:
|
|
24
24
|
|
25
25
|
## Versioning
|
26
26
|
|
27
|
-
momentjs-rails 1.
|
27
|
+
momentjs-rails 1.7.0 == Moment.js 1.7.0
|
28
28
|
|
29
29
|
Every attempt is made to mirror the currently shipping Momentum.js version number wherever possible.
|
30
30
|
The major, minor, and patch version numbers will always represent the Momentum.js version. Should a gem
|
data/changelog.md
CHANGED
@@ -1,29 +1,38 @@
|
|
1
1
|
// moment.js
|
2
|
-
// version : 1.
|
2
|
+
// version : 1.7.0
|
3
3
|
// author : Tim Wood
|
4
4
|
// license : MIT
|
5
5
|
// momentjs.com
|
6
6
|
|
7
7
|
(function (Date, undefined) {
|
8
8
|
|
9
|
+
/************************************
|
10
|
+
Constants
|
11
|
+
************************************/
|
12
|
+
|
9
13
|
var moment,
|
10
|
-
VERSION = "1.
|
14
|
+
VERSION = "1.7.0",
|
11
15
|
round = Math.round, i,
|
12
16
|
// internal storage for language config files
|
13
17
|
languages = {},
|
14
18
|
currentLanguage = 'en',
|
15
19
|
|
16
20
|
// check for nodeJS
|
17
|
-
hasModule = (typeof module !== 'undefined'),
|
21
|
+
hasModule = (typeof module !== 'undefined' && module.exports),
|
18
22
|
|
19
|
-
//
|
20
|
-
|
23
|
+
// Parameters to check for on the lang config. This list of properties
|
24
|
+
// will be inherited from English if not provided in a language
|
25
|
+
// definition. monthsParse is also a lang config property, but it
|
26
|
+
// cannot be inherited and as such cannot be enumerated here.
|
27
|
+
langConfigProperties = 'months|monthsShort|weekdays|weekdaysShort|weekdaysMin|longDateFormat|calendar|relativeTime|ordinal|meridiem'.split('|'),
|
21
28
|
|
22
29
|
// ASP.NET json date format regex
|
23
30
|
aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,
|
24
31
|
|
25
32
|
// format tokens
|
26
|
-
formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|
|
33
|
+
formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|SS?S?|zz?|ZZ?)/g,
|
34
|
+
localFormattingTokens = /(LT|LL?L?L?)/g,
|
35
|
+
formattingRemoveEscapes = /(^\[)|(\\)|\]$/g,
|
27
36
|
|
28
37
|
// parsing tokens
|
29
38
|
parseMultipleFormatChunker = /([0-9a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+)/gi,
|
@@ -32,7 +41,7 @@
|
|
32
41
|
parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99
|
33
42
|
parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999
|
34
43
|
parseTokenThreeDigits = /\d{3}/, // 000 - 999
|
35
|
-
parseTokenFourDigits = /\d{4}/, //
|
44
|
+
parseTokenFourDigits = /\d{1,4}/, // 0 - 9999
|
36
45
|
parseTokenWord = /[0-9a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+/i, // any word characters or numbers
|
37
46
|
parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/i, // +00:00 -00:00 +0000 -0000 or Z
|
38
47
|
parseTokenT = /T/i, // T (ISO seperator)
|
@@ -63,20 +72,77 @@
|
|
63
72
|
'Days' : 864e5,
|
64
73
|
'Months' : 2592e6,
|
65
74
|
'Years' : 31536e6
|
66
|
-
}
|
75
|
+
},
|
76
|
+
|
77
|
+
// format function strings
|
78
|
+
formatFunctions = {},
|
79
|
+
|
80
|
+
/*
|
81
|
+
* moment.fn.format uses new Function() to create an inlined formatting function.
|
82
|
+
* Results are a 3x speed boost
|
83
|
+
* http://jsperf.com/momentjs-cached-format-functions
|
84
|
+
*
|
85
|
+
* These strings are appended into a function using replaceFormatTokens and makeFormatFunction
|
86
|
+
*/
|
87
|
+
formatFunctionStrings = {
|
88
|
+
// a = placeholder
|
89
|
+
// b = placeholder
|
90
|
+
// t = the current moment being formatted
|
91
|
+
// v = getValueAtKey function
|
92
|
+
// o = language.ordinal function
|
93
|
+
// p = leftZeroFill function
|
94
|
+
// m = language.meridiem value or function
|
95
|
+
M : '(a=t.month()+1)',
|
96
|
+
MMM : 'v("monthsShort",t.month())',
|
97
|
+
MMMM : 'v("months",t.month())',
|
98
|
+
D : '(a=t.date())',
|
99
|
+
DDD : '(a=new Date(t.year(),t.month(),t.date()),b=new Date(t.year(),0,1),a=~~(((a-b)/864e5)+1.5))',
|
100
|
+
d : '(a=t.day())',
|
101
|
+
dd : 'v("weekdaysMin",t.day())',
|
102
|
+
ddd : 'v("weekdaysShort",t.day())',
|
103
|
+
dddd : 'v("weekdays",t.day())',
|
104
|
+
w : '(a=new Date(t.year(),t.month(),t.date()-t.day()+5),b=new Date(a.getFullYear(),0,4),a=~~((a-b)/864e5/7+1.5))',
|
105
|
+
YY : 'p(t.year()%100,2)',
|
106
|
+
YYYY : 'p(t.year(),4)',
|
107
|
+
a : 'm(t.hours(),t.minutes(),!0)',
|
108
|
+
A : 'm(t.hours(),t.minutes(),!1)',
|
109
|
+
H : 't.hours()',
|
110
|
+
h : 't.hours()%12||12',
|
111
|
+
m : 't.minutes()',
|
112
|
+
s : 't.seconds()',
|
113
|
+
S : '~~(t.milliseconds()/100)',
|
114
|
+
SS : 'p(~~(t.milliseconds()/10),2)',
|
115
|
+
SSS : 'p(t.milliseconds(),3)',
|
116
|
+
Z : '((a=-t.zone())<0?((a=-a),"-"):"+")+p(~~(a/60),2)+":"+p(~~a%60,2)',
|
117
|
+
ZZ : '((a=-t.zone())<0?((a=-a),"-"):"+")+p(~~(10*a/6),4)'
|
118
|
+
},
|
119
|
+
|
120
|
+
ordinalizeTokens = 'DDD w M D d'.split(' '),
|
121
|
+
paddedTokens = 'M D H h m s w'.split(' ');
|
122
|
+
|
123
|
+
while (ordinalizeTokens.length) {
|
124
|
+
i = ordinalizeTokens.pop();
|
125
|
+
formatFunctionStrings[i + 'o'] = formatFunctionStrings[i] + '+o(a)';
|
126
|
+
}
|
127
|
+
while (paddedTokens.length) {
|
128
|
+
i = paddedTokens.pop();
|
129
|
+
formatFunctionStrings[i + i] = 'p(' + formatFunctionStrings[i] + ',2)';
|
130
|
+
}
|
131
|
+
formatFunctionStrings.DDDD = 'p(' + formatFunctionStrings.DDD + ',3)';
|
132
|
+
|
133
|
+
|
134
|
+
/************************************
|
135
|
+
Constructors
|
136
|
+
************************************/
|
137
|
+
|
67
138
|
|
68
139
|
// Moment prototype object
|
69
|
-
function Moment(date, isUTC) {
|
140
|
+
function Moment(date, isUTC, lang) {
|
70
141
|
this._d = date;
|
71
142
|
this._isUTC = !!isUTC;
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
if (number < 0) {
|
76
|
-
return Math.ceil(number);
|
77
|
-
} else {
|
78
|
-
return Math.floor(number);
|
79
|
-
}
|
143
|
+
this._a = date._a || null;
|
144
|
+
date._a = null;
|
145
|
+
this._lang = lang || false;
|
80
146
|
}
|
81
147
|
|
82
148
|
// Duration Constructor
|
@@ -129,6 +195,22 @@
|
|
129
195
|
years += absRound(months / 12);
|
130
196
|
|
131
197
|
data.years = years;
|
198
|
+
|
199
|
+
this._lang = false;
|
200
|
+
}
|
201
|
+
|
202
|
+
|
203
|
+
/************************************
|
204
|
+
Helpers
|
205
|
+
************************************/
|
206
|
+
|
207
|
+
|
208
|
+
function absRound(number) {
|
209
|
+
if (number < 0) {
|
210
|
+
return Math.ceil(number);
|
211
|
+
} else {
|
212
|
+
return Math.floor(number);
|
213
|
+
}
|
132
214
|
}
|
133
215
|
|
134
216
|
// left zero fill a number
|
@@ -167,141 +249,152 @@
|
|
167
249
|
return Object.prototype.toString.call(input) === '[object Array]';
|
168
250
|
}
|
169
251
|
|
252
|
+
// compare two arrays, return the number of differences
|
253
|
+
function compareArrays(array1, array2) {
|
254
|
+
var len = Math.min(array1.length, array2.length),
|
255
|
+
lengthDiff = Math.abs(array1.length - array2.length),
|
256
|
+
diffs = 0,
|
257
|
+
i;
|
258
|
+
for (i = 0; i < len; i++) {
|
259
|
+
if (~~array1[i] !== ~~array2[i]) {
|
260
|
+
diffs++;
|
261
|
+
}
|
262
|
+
}
|
263
|
+
return diffs + lengthDiff;
|
264
|
+
}
|
265
|
+
|
170
266
|
// convert an array to a date.
|
171
267
|
// the array should mirror the parameters below
|
172
268
|
// note: all values past the year are optional and will default to the lowest possible value.
|
173
269
|
// [year, month, day , hour, minute, second, millisecond]
|
174
|
-
function dateFromArray(input) {
|
175
|
-
|
270
|
+
function dateFromArray(input, asUTC) {
|
271
|
+
var i, date;
|
272
|
+
for (i = 1; i < 7; i++) {
|
273
|
+
input[i] = (input[i] == null) ? (i === 2 ? 1 : 0) : input[i];
|
274
|
+
}
|
275
|
+
// we store whether we used utc or not in the input array
|
276
|
+
input[7] = asUTC;
|
277
|
+
date = new Date(0);
|
278
|
+
if (asUTC) {
|
279
|
+
date.setUTCFullYear(input[0], input[1], input[2]);
|
280
|
+
date.setUTCHours(input[3], input[4], input[5], input[6]);
|
281
|
+
} else {
|
282
|
+
date.setFullYear(input[0], input[1], input[2]);
|
283
|
+
date.setHours(input[3], input[4], input[5], input[6]);
|
284
|
+
}
|
285
|
+
date._a = input;
|
286
|
+
return date;
|
287
|
+
}
|
288
|
+
|
289
|
+
// Loads a language definition into the `languages` cache. The function
|
290
|
+
// takes a key and optionally values. If not in the browser and no values
|
291
|
+
// are provided, it will load the language file module. As a convenience,
|
292
|
+
// this function also returns the language values.
|
293
|
+
function loadLang(key, values) {
|
294
|
+
var i, m,
|
295
|
+
parse = [];
|
296
|
+
|
297
|
+
if (!values && hasModule) {
|
298
|
+
values = require('./lang/' + key);
|
299
|
+
}
|
300
|
+
|
301
|
+
for (i = 0; i < langConfigProperties.length; i++) {
|
302
|
+
// If a language definition does not provide a value, inherit
|
303
|
+
// from English
|
304
|
+
values[langConfigProperties[i]] = values[langConfigProperties[i]] ||
|
305
|
+
languages.en[langConfigProperties[i]];
|
306
|
+
}
|
307
|
+
|
308
|
+
for (i = 0; i < 12; i++) {
|
309
|
+
m = moment([2000, i]);
|
310
|
+
parse[i] = new RegExp('^' + (values.months[i] || values.months(m, '')) +
|
311
|
+
'|^' + (values.monthsShort[i] || values.monthsShort(m, '')).replace('.', ''), 'i');
|
312
|
+
}
|
313
|
+
values.monthsParse = values.monthsParse || parse;
|
314
|
+
|
315
|
+
languages[key] = values;
|
316
|
+
|
317
|
+
return values;
|
318
|
+
}
|
319
|
+
|
320
|
+
// Determines which language definition to use and returns it.
|
321
|
+
//
|
322
|
+
// With no parameters, it will return the global language. If you
|
323
|
+
// pass in a language key, such as 'en', it will return the
|
324
|
+
// definition for 'en', so long as 'en' has already been loaded using
|
325
|
+
// moment.lang. If you pass in a moment or duration instance, it
|
326
|
+
// will decide the language based on that, or default to the global
|
327
|
+
// language.
|
328
|
+
function getLangDefinition(m) {
|
329
|
+
var langKey = (typeof m === 'string') && m ||
|
330
|
+
m && m._lang ||
|
331
|
+
null;
|
332
|
+
|
333
|
+
return langKey ? (languages[langKey] || loadLang(langKey)) : moment;
|
334
|
+
}
|
335
|
+
|
336
|
+
|
337
|
+
/************************************
|
338
|
+
Formatting
|
339
|
+
************************************/
|
340
|
+
|
341
|
+
|
342
|
+
// helper for building inline formatting functions
|
343
|
+
function replaceFormatTokens(token) {
|
344
|
+
return formatFunctionStrings[token] ?
|
345
|
+
("'+(" + formatFunctionStrings[token] + ")+'") :
|
346
|
+
token.replace(formattingRemoveEscapes, "").replace(/\\?'/g, "\\'");
|
347
|
+
}
|
348
|
+
|
349
|
+
// helper for recursing long date formatting tokens
|
350
|
+
function replaceLongDateFormatTokens(input) {
|
351
|
+
return getLangDefinition().longDateFormat[input] || input;
|
352
|
+
}
|
353
|
+
|
354
|
+
function makeFormatFunction(format) {
|
355
|
+
var output = "var a,b;return '" +
|
356
|
+
format.replace(formattingTokens, replaceFormatTokens) + "';",
|
357
|
+
Fn = Function; // get around jshint
|
358
|
+
// t = the current moment being formatted
|
359
|
+
// v = getValueAtKey function
|
360
|
+
// o = language.ordinal function
|
361
|
+
// p = leftZeroFill function
|
362
|
+
// m = language.meridiem value or function
|
363
|
+
return new Fn('t', 'v', 'o', 'p', 'm', output);
|
364
|
+
}
|
365
|
+
|
366
|
+
function makeOrGetFormatFunction(format) {
|
367
|
+
if (!formatFunctions[format]) {
|
368
|
+
formatFunctions[format] = makeFormatFunction(format);
|
369
|
+
}
|
370
|
+
return formatFunctions[format];
|
176
371
|
}
|
177
372
|
|
178
373
|
// format date using native date object
|
179
|
-
function formatMoment(m,
|
180
|
-
var
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
// return formatted string or non string.
|
193
|
-
//
|
194
|
-
// uses switch/case instead of an object of named functions (like http://phpjs.org/functions/date:380)
|
195
|
-
// for minification and performance
|
196
|
-
// see http://jsperf.com/object-of-functions-vs-switch for performance comparison
|
197
|
-
function replaceFunction(input) {
|
198
|
-
// create a couple variables to be used later inside one of the cases.
|
199
|
-
var a, b;
|
200
|
-
switch (input) {
|
201
|
-
// MONTH
|
202
|
-
case 'M' :
|
203
|
-
return currentMonth + 1;
|
204
|
-
case 'Mo' :
|
205
|
-
return (currentMonth + 1) + ordinal(currentMonth + 1);
|
206
|
-
case 'MM' :
|
207
|
-
return leftZeroFill(currentMonth + 1, 2);
|
208
|
-
case 'MMM' :
|
209
|
-
return moment.monthsShort[currentMonth];
|
210
|
-
case 'MMMM' :
|
211
|
-
return moment.months[currentMonth];
|
212
|
-
// DAY OF MONTH
|
213
|
-
case 'D' :
|
214
|
-
return currentDate;
|
215
|
-
case 'Do' :
|
216
|
-
return currentDate + ordinal(currentDate);
|
217
|
-
case 'DD' :
|
218
|
-
return leftZeroFill(currentDate, 2);
|
219
|
-
// DAY OF YEAR
|
220
|
-
case 'DDD' :
|
221
|
-
a = new Date(currentYear, currentMonth, currentDate);
|
222
|
-
b = new Date(currentYear, 0, 1);
|
223
|
-
return ~~ (((a - b) / 864e5) + 1.5);
|
224
|
-
case 'DDDo' :
|
225
|
-
a = replaceFunction('DDD');
|
226
|
-
return a + ordinal(a);
|
227
|
-
case 'DDDD' :
|
228
|
-
return leftZeroFill(replaceFunction('DDD'), 3);
|
229
|
-
// WEEKDAY
|
230
|
-
case 'd' :
|
231
|
-
return currentDay;
|
232
|
-
case 'do' :
|
233
|
-
return currentDay + ordinal(currentDay);
|
234
|
-
case 'ddd' :
|
235
|
-
return moment.weekdaysShort[currentDay];
|
236
|
-
case 'dddd' :
|
237
|
-
return moment.weekdays[currentDay];
|
238
|
-
// WEEK OF YEAR
|
239
|
-
case 'w' :
|
240
|
-
a = new Date(currentYear, currentMonth, currentDate - currentDay + 5);
|
241
|
-
b = new Date(a.getFullYear(), 0, 4);
|
242
|
-
return ~~ ((a - b) / 864e5 / 7 + 1.5);
|
243
|
-
case 'wo' :
|
244
|
-
a = replaceFunction('w');
|
245
|
-
return a + ordinal(a);
|
246
|
-
case 'ww' :
|
247
|
-
return leftZeroFill(replaceFunction('w'), 2);
|
248
|
-
// YEAR
|
249
|
-
case 'YY' :
|
250
|
-
return leftZeroFill(currentYear % 100, 2);
|
251
|
-
case 'YYYY' :
|
252
|
-
return currentYear;
|
253
|
-
// AM / PM
|
254
|
-
case 'a' :
|
255
|
-
return meridiem ? meridiem(currentHours, currentMinutes, false) : (currentHours > 11 ? 'pm' : 'am');
|
256
|
-
case 'A' :
|
257
|
-
return meridiem ? meridiem(currentHours, currentMinutes, true) : (currentHours > 11 ? 'PM' : 'AM');
|
258
|
-
// 24 HOUR
|
259
|
-
case 'H' :
|
260
|
-
return currentHours;
|
261
|
-
case 'HH' :
|
262
|
-
return leftZeroFill(currentHours, 2);
|
263
|
-
// 12 HOUR
|
264
|
-
case 'h' :
|
265
|
-
return currentHours % 12 || 12;
|
266
|
-
case 'hh' :
|
267
|
-
return leftZeroFill(currentHours % 12 || 12, 2);
|
268
|
-
// MINUTE
|
269
|
-
case 'm' :
|
270
|
-
return currentMinutes;
|
271
|
-
case 'mm' :
|
272
|
-
return leftZeroFill(currentMinutes, 2);
|
273
|
-
// SECOND
|
274
|
-
case 's' :
|
275
|
-
return currentSeconds;
|
276
|
-
case 'ss' :
|
277
|
-
return leftZeroFill(currentSeconds, 2);
|
278
|
-
// MILLISECONDS
|
279
|
-
case 'S' :
|
280
|
-
return ~~ (currentMilliseconds / 100);
|
281
|
-
case 'SS' :
|
282
|
-
return leftZeroFill(~~(currentMilliseconds / 10), 2);
|
283
|
-
case 'SSS' :
|
284
|
-
return leftZeroFill(currentMilliseconds, 3);
|
285
|
-
// TIMEZONE
|
286
|
-
case 'Z' :
|
287
|
-
return (currentZone < 0 ? '-' : '+') + leftZeroFill(~~(Math.abs(currentZone) / 60), 2) + ':' + leftZeroFill(~~(Math.abs(currentZone) % 60), 2);
|
288
|
-
case 'ZZ' :
|
289
|
-
return (currentZone < 0 ? '-' : '+') + leftZeroFill(~~(10 * Math.abs(currentZone) / 6), 4);
|
290
|
-
// LONG DATES
|
291
|
-
case 'L' :
|
292
|
-
case 'LL' :
|
293
|
-
case 'LLL' :
|
294
|
-
case 'LLLL' :
|
295
|
-
case 'LT' :
|
296
|
-
return formatMoment(m, moment.longDateFormat[input]);
|
297
|
-
// DEFAULT
|
298
|
-
default :
|
299
|
-
return input.replace(/(^\[)|(\\)|\]$/g, "");
|
300
|
-
}
|
374
|
+
function formatMoment(m, format) {
|
375
|
+
var lang = getLangDefinition(m);
|
376
|
+
|
377
|
+
function getValueFromArray(key, index) {
|
378
|
+
return lang[key].call ? lang[key](m, format) : lang[key][index];
|
379
|
+
}
|
380
|
+
|
381
|
+
while (localFormattingTokens.test(format)) {
|
382
|
+
format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
|
383
|
+
}
|
384
|
+
|
385
|
+
if (!formatFunctions[format]) {
|
386
|
+
formatFunctions[format] = makeFormatFunction(format);
|
301
387
|
}
|
302
|
-
|
388
|
+
|
389
|
+
return formatFunctions[format](m, getValueFromArray, lang.ordinal, leftZeroFill, lang.meridiem);
|
303
390
|
}
|
304
391
|
|
392
|
+
|
393
|
+
/************************************
|
394
|
+
Parsing
|
395
|
+
************************************/
|
396
|
+
|
397
|
+
|
305
398
|
// get the regex to find the next token
|
306
399
|
function getParseRegexForToken(token) {
|
307
400
|
switch (token) {
|
@@ -316,6 +409,7 @@
|
|
316
409
|
return parseTokenOneToThreeDigits;
|
317
410
|
case 'MMM':
|
318
411
|
case 'MMMM':
|
412
|
+
case 'dd':
|
319
413
|
case 'ddd':
|
320
414
|
case 'dddd':
|
321
415
|
case 'a':
|
@@ -328,7 +422,6 @@
|
|
328
422
|
return parseTokenT;
|
329
423
|
case 'MM':
|
330
424
|
case 'DD':
|
331
|
-
case 'dd':
|
332
425
|
case 'YY':
|
333
426
|
case 'HH':
|
334
427
|
case 'hh':
|
@@ -360,7 +453,7 @@
|
|
360
453
|
case 'MMM' : // fall through to MMMM
|
361
454
|
case 'MMMM' :
|
362
455
|
for (a = 0; a < 12; a++) {
|
363
|
-
if (
|
456
|
+
if (getLangDefinition().monthsParse[a].test(input)) {
|
364
457
|
datePartArray[1] = a;
|
365
458
|
break;
|
366
459
|
}
|
@@ -371,7 +464,9 @@
|
|
371
464
|
case 'DD' : // fall through to DDDD
|
372
465
|
case 'DDD' : // fall through to DDDD
|
373
466
|
case 'DDDD' :
|
374
|
-
|
467
|
+
if (input != null) {
|
468
|
+
datePartArray[2] = ~~input;
|
469
|
+
}
|
375
470
|
break;
|
376
471
|
// YEAR
|
377
472
|
case 'YY' :
|
@@ -456,21 +551,7 @@
|
|
456
551
|
datePartArray[3] += config.tzh;
|
457
552
|
datePartArray[4] += config.tzm;
|
458
553
|
// return
|
459
|
-
return config.isUTC
|
460
|
-
}
|
461
|
-
|
462
|
-
// compare two arrays, return the number of differences
|
463
|
-
function compareArrays(array1, array2) {
|
464
|
-
var len = Math.min(array1.length, array2.length),
|
465
|
-
lengthDiff = Math.abs(array1.length - array2.length),
|
466
|
-
diffs = 0,
|
467
|
-
i;
|
468
|
-
for (i = 0; i < len; i++) {
|
469
|
-
if (~~array1[i] !== ~~array2[i]) {
|
470
|
-
diffs++;
|
471
|
-
}
|
472
|
-
}
|
473
|
-
return diffs + lengthDiff;
|
554
|
+
return dateFromArray(datePartArray, config.isUTC);
|
474
555
|
}
|
475
556
|
|
476
557
|
// date from string and array of format strings
|
@@ -512,15 +593,21 @@
|
|
512
593
|
return new Date(string);
|
513
594
|
}
|
514
595
|
|
596
|
+
|
597
|
+
/************************************
|
598
|
+
Relative Time
|
599
|
+
************************************/
|
600
|
+
|
601
|
+
|
515
602
|
// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
|
516
|
-
function substituteTimeAgo(string, number, withoutSuffix, isFuture) {
|
517
|
-
var rt =
|
603
|
+
function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) {
|
604
|
+
var rt = lang.relativeTime[string];
|
518
605
|
return (typeof rt === 'function') ?
|
519
606
|
rt(number || 1, !!withoutSuffix, string, isFuture) :
|
520
607
|
rt.replace(/%d/i, number || 1);
|
521
608
|
}
|
522
609
|
|
523
|
-
function relativeTime(milliseconds, withoutSuffix) {
|
610
|
+
function relativeTime(milliseconds, withoutSuffix, lang) {
|
524
611
|
var seconds = round(Math.abs(milliseconds) / 1000),
|
525
612
|
minutes = round(seconds / 60),
|
526
613
|
hours = round(minutes / 60),
|
@@ -538,20 +625,25 @@
|
|
538
625
|
years === 1 && ['y'] || ['yy', years];
|
539
626
|
args[2] = withoutSuffix;
|
540
627
|
args[3] = milliseconds > 0;
|
628
|
+
args[4] = lang;
|
541
629
|
return substituteTimeAgo.apply({}, args);
|
542
630
|
}
|
543
631
|
|
632
|
+
|
633
|
+
/************************************
|
634
|
+
Top Level Functions
|
635
|
+
************************************/
|
636
|
+
|
637
|
+
|
544
638
|
moment = function (input, format) {
|
545
639
|
if (input === null || input === '') {
|
546
640
|
return null;
|
547
641
|
}
|
548
642
|
var date,
|
549
|
-
matched
|
550
|
-
isUTC;
|
643
|
+
matched;
|
551
644
|
// parse Moment object
|
552
645
|
if (moment.isMoment(input)) {
|
553
|
-
|
554
|
-
isUTC = input._isUTC;
|
646
|
+
return new Moment(new Date(+input._d), input._isUTC, input._lang);
|
555
647
|
// parse string and format
|
556
648
|
} else if (format) {
|
557
649
|
if (isArray(format)) {
|
@@ -569,17 +661,23 @@
|
|
569
661
|
typeof input === 'string' ? makeDateFromString(input) :
|
570
662
|
new Date(input);
|
571
663
|
}
|
572
|
-
|
664
|
+
|
665
|
+
return new Moment(date);
|
573
666
|
};
|
574
667
|
|
575
668
|
// creating with utc
|
576
669
|
moment.utc = function (input, format) {
|
577
670
|
if (isArray(input)) {
|
578
|
-
return new Moment(
|
671
|
+
return new Moment(dateFromArray(input, true), true);
|
672
|
+
}
|
673
|
+
// if we don't have a timezone, we need to add one to trigger parsing into utc
|
674
|
+
if (typeof input === 'string' && !parseTokenTimezone.exec(input)) {
|
675
|
+
input += ' +0000';
|
676
|
+
if (format) {
|
677
|
+
format += ' Z';
|
678
|
+
}
|
579
679
|
}
|
580
|
-
return (format
|
581
|
-
moment(input + ' +0000', format + ' Z').utc() :
|
582
|
-
moment(input && !parseTokenTimezone.exec(input) ? input + '+0000' : input).utc();
|
680
|
+
return moment(input, format).utc();
|
583
681
|
};
|
584
682
|
|
585
683
|
// creating with unix timestamp (in seconds)
|
@@ -591,7 +689,8 @@
|
|
591
689
|
moment.duration = function (input, key) {
|
592
690
|
var isDuration = moment.isDuration(input),
|
593
691
|
isNumber = (typeof input === 'number'),
|
594
|
-
duration = (isDuration ? input._data : (isNumber ? {} : input))
|
692
|
+
duration = (isDuration ? input._data : (isNumber ? {} : input)),
|
693
|
+
ret;
|
595
694
|
|
596
695
|
if (isNumber) {
|
597
696
|
if (key) {
|
@@ -601,7 +700,13 @@
|
|
601
700
|
}
|
602
701
|
}
|
603
702
|
|
604
|
-
|
703
|
+
ret = new Duration(duration);
|
704
|
+
|
705
|
+
if (isDuration) {
|
706
|
+
ret._lang = input._lang;
|
707
|
+
}
|
708
|
+
|
709
|
+
return ret;
|
605
710
|
};
|
606
711
|
|
607
712
|
// humanizeDuration
|
@@ -617,40 +722,49 @@
|
|
617
722
|
// default format
|
618
723
|
moment.defaultFormat = isoFormat;
|
619
724
|
|
620
|
-
//
|
725
|
+
// This function will load languages and then set the global language. If
|
726
|
+
// no arguments are passed in, it will simply return the current global
|
727
|
+
// language key.
|
621
728
|
moment.lang = function (key, values) {
|
622
|
-
var i
|
623
|
-
|
729
|
+
var i;
|
730
|
+
|
624
731
|
if (!key) {
|
625
732
|
return currentLanguage;
|
626
733
|
}
|
627
|
-
if (values) {
|
628
|
-
|
629
|
-
parse[i] = new RegExp('^' + values.months[i] + '|^' + values.monthsShort[i].replace('.', ''), 'i');
|
630
|
-
}
|
631
|
-
values.monthsParse = values.monthsParse || parse;
|
632
|
-
languages[key] = values;
|
734
|
+
if (values || !languages[key]) {
|
735
|
+
loadLang(key, values);
|
633
736
|
}
|
634
737
|
if (languages[key]) {
|
738
|
+
// deprecated, to get the language definition variables, use the
|
739
|
+
// moment.fn.lang method or the getLangDefinition function.
|
635
740
|
for (i = 0; i < langConfigProperties.length; i++) {
|
636
|
-
moment[langConfigProperties[i]] = languages[key][langConfigProperties[i]]
|
637
|
-
languages.en[langConfigProperties[i]];
|
741
|
+
moment[langConfigProperties[i]] = languages[key][langConfigProperties[i]];
|
638
742
|
}
|
743
|
+
moment.monthsParse = languages[key].monthsParse;
|
639
744
|
currentLanguage = key;
|
640
|
-
} else {
|
641
|
-
if (hasModule) {
|
642
|
-
req = require('./lang/' + key);
|
643
|
-
moment.lang(key, req);
|
644
|
-
}
|
645
745
|
}
|
646
746
|
};
|
647
747
|
|
648
|
-
//
|
748
|
+
// returns language data
|
749
|
+
moment.langData = getLangDefinition;
|
750
|
+
|
751
|
+
// compare moment object
|
752
|
+
moment.isMoment = function (obj) {
|
753
|
+
return obj instanceof Moment;
|
754
|
+
};
|
755
|
+
|
756
|
+
// for typechecking Duration objects
|
757
|
+
moment.isDuration = function (obj) {
|
758
|
+
return obj instanceof Duration;
|
759
|
+
};
|
760
|
+
|
761
|
+
// Set default language, other languages will inherit from English.
|
649
762
|
moment.lang('en', {
|
650
763
|
months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
|
651
764
|
monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
|
652
765
|
weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
|
653
766
|
weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
|
767
|
+
weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
|
654
768
|
longDateFormat : {
|
655
769
|
LT : "h:mm A",
|
656
770
|
L : "MM/DD/YYYY",
|
@@ -658,7 +772,13 @@
|
|
658
772
|
LLL : "MMMM D YYYY LT",
|
659
773
|
LLLL : "dddd, MMMM D YYYY LT"
|
660
774
|
},
|
661
|
-
meridiem :
|
775
|
+
meridiem : function (hours, minutes, isLower) {
|
776
|
+
if (hours > 11) {
|
777
|
+
return isLower ? 'pm' : 'PM';
|
778
|
+
} else {
|
779
|
+
return isLower ? 'am' : 'AM';
|
780
|
+
}
|
781
|
+
},
|
662
782
|
calendar : {
|
663
783
|
sameDay : '[Today at] LT',
|
664
784
|
nextDay : '[Tomorrow at] LT',
|
@@ -691,17 +811,12 @@
|
|
691
811
|
}
|
692
812
|
});
|
693
813
|
|
694
|
-
// compare moment object
|
695
|
-
moment.isMoment = function (obj) {
|
696
|
-
return obj instanceof Moment;
|
697
|
-
};
|
698
814
|
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
815
|
+
/************************************
|
816
|
+
Moment Prototype
|
817
|
+
************************************/
|
818
|
+
|
703
819
|
|
704
|
-
// shortcut for prototype
|
705
820
|
moment.fn = Moment.prototype = {
|
706
821
|
|
707
822
|
clone : function () {
|
@@ -724,6 +839,27 @@
|
|
724
839
|
return this._d;
|
725
840
|
},
|
726
841
|
|
842
|
+
toArray : function () {
|
843
|
+
var m = this;
|
844
|
+
return [
|
845
|
+
m.year(),
|
846
|
+
m.month(),
|
847
|
+
m.date(),
|
848
|
+
m.hours(),
|
849
|
+
m.minutes(),
|
850
|
+
m.seconds(),
|
851
|
+
m.milliseconds(),
|
852
|
+
!!this._isUTC
|
853
|
+
];
|
854
|
+
},
|
855
|
+
|
856
|
+
isValid : function () {
|
857
|
+
if (this._a) {
|
858
|
+
return !compareArrays(this._a, (this._a[7] ? moment.utc(this) : this).toArray());
|
859
|
+
}
|
860
|
+
return !isNaN(this._d.getTime());
|
861
|
+
},
|
862
|
+
|
727
863
|
utc : function () {
|
728
864
|
this._isUTC = true;
|
729
865
|
return this;
|
@@ -774,7 +910,7 @@
|
|
774
910
|
},
|
775
911
|
|
776
912
|
from : function (time, withoutSuffix) {
|
777
|
-
return moment.duration(this.diff(time)).humanize(!withoutSuffix);
|
913
|
+
return moment.duration(this.diff(time)).lang(this._lang).humanize(!withoutSuffix);
|
778
914
|
},
|
779
915
|
|
780
916
|
fromNow : function (withoutSuffix) {
|
@@ -783,7 +919,7 @@
|
|
783
919
|
|
784
920
|
calendar : function () {
|
785
921
|
var diff = this.diff(moment().sod(), 'days', true),
|
786
|
-
calendar =
|
922
|
+
calendar = this.lang().calendar,
|
787
923
|
allElse = calendar.sameElse,
|
788
924
|
format = diff < -6 ? allElse :
|
789
925
|
diff < -1 ? calendar.lastWeek :
|
@@ -810,20 +946,43 @@
|
|
810
946
|
this.add({ d : input - day });
|
811
947
|
},
|
812
948
|
|
949
|
+
startOf: function (val) {
|
950
|
+
// the following switch intentionally omits break keywords
|
951
|
+
// to utilize falling through the cases.
|
952
|
+
switch (val.replace(/s$/, '')) {
|
953
|
+
case 'year':
|
954
|
+
this.month(0);
|
955
|
+
/* falls through */
|
956
|
+
case 'month':
|
957
|
+
this.date(1);
|
958
|
+
/* falls through */
|
959
|
+
case 'day':
|
960
|
+
this.hours(0);
|
961
|
+
/* falls through */
|
962
|
+
case 'hour':
|
963
|
+
this.minutes(0);
|
964
|
+
/* falls through */
|
965
|
+
case 'minute':
|
966
|
+
this.seconds(0);
|
967
|
+
/* falls through */
|
968
|
+
case 'second':
|
969
|
+
this.milliseconds(0);
|
970
|
+
/* falls through */
|
971
|
+
}
|
972
|
+
return this;
|
973
|
+
},
|
974
|
+
|
975
|
+
endOf: function (val) {
|
976
|
+
return this.startOf(val).add(val.replace(/s?$/, 's'), 1).subtract('ms', 1);
|
977
|
+
},
|
978
|
+
|
813
979
|
sod: function () {
|
814
|
-
return
|
815
|
-
.hours(0)
|
816
|
-
.minutes(0)
|
817
|
-
.seconds(0)
|
818
|
-
.milliseconds(0);
|
980
|
+
return this.clone().startOf('day');
|
819
981
|
},
|
820
982
|
|
821
983
|
eod: function () {
|
822
984
|
// end of day = start of day plus 1 day, minus 1 millisecond
|
823
|
-
return this.
|
824
|
-
d : 1,
|
825
|
-
ms : -1
|
826
|
-
});
|
985
|
+
return this.clone().endOf('day');
|
827
986
|
},
|
828
987
|
|
829
988
|
zone : function () {
|
@@ -831,7 +990,19 @@
|
|
831
990
|
},
|
832
991
|
|
833
992
|
daysInMonth : function () {
|
834
|
-
return moment(this
|
993
|
+
return moment.utc([this.year(), this.month() + 1, 0]).date();
|
994
|
+
},
|
995
|
+
|
996
|
+
// If passed a language key, it will set the language for this
|
997
|
+
// instance. Otherwise, it will return the language configuration
|
998
|
+
// variables for this instance.
|
999
|
+
lang : function (lang) {
|
1000
|
+
if (lang === undefined) {
|
1001
|
+
return getLangDefinition(this);
|
1002
|
+
} else {
|
1003
|
+
this._lang = lang;
|
1004
|
+
return this;
|
1005
|
+
}
|
835
1006
|
}
|
836
1007
|
};
|
837
1008
|
|
@@ -856,6 +1027,12 @@
|
|
856
1027
|
// add shortcut for year (uses different syntax than the getter/setter 'year' == 'FullYear')
|
857
1028
|
makeGetterAndSetter('year', 'FullYear');
|
858
1029
|
|
1030
|
+
|
1031
|
+
/************************************
|
1032
|
+
Duration Prototype
|
1033
|
+
************************************/
|
1034
|
+
|
1035
|
+
|
859
1036
|
moment.duration.fn = Duration.prototype = {
|
860
1037
|
weeks : function () {
|
861
1038
|
return absRound(this.days() / 7);
|
@@ -869,15 +1046,17 @@
|
|
869
1046
|
|
870
1047
|
humanize : function (withSuffix) {
|
871
1048
|
var difference = +this,
|
872
|
-
rel =
|
873
|
-
output = relativeTime(difference, !withSuffix);
|
1049
|
+
rel = this.lang().relativeTime,
|
1050
|
+
output = relativeTime(difference, !withSuffix, this.lang());
|
874
1051
|
|
875
1052
|
if (withSuffix) {
|
876
1053
|
output = (difference <= 0 ? rel.past : rel.future).replace(/%s/i, output);
|
877
1054
|
}
|
878
1055
|
|
879
1056
|
return output;
|
880
|
-
}
|
1057
|
+
},
|
1058
|
+
|
1059
|
+
lang : moment.fn.lang
|
881
1060
|
};
|
882
1061
|
|
883
1062
|
function makeDurationGetter(name) {
|
@@ -901,13 +1080,22 @@
|
|
901
1080
|
|
902
1081
|
makeDurationAsGetter('Weeks', 6048e5);
|
903
1082
|
|
1083
|
+
|
1084
|
+
/************************************
|
1085
|
+
Exposing Moment
|
1086
|
+
************************************/
|
1087
|
+
|
1088
|
+
|
904
1089
|
// CommonJS module is defined
|
905
1090
|
if (hasModule) {
|
906
1091
|
module.exports = moment;
|
907
1092
|
}
|
908
1093
|
/*global ender:false */
|
909
|
-
if (typeof
|
910
|
-
window
|
1094
|
+
if (typeof ender === 'undefined') {
|
1095
|
+
// here, `this` means `window` in the browser, or `global` on the server
|
1096
|
+
// add `moment` as a global object via a string identifier,
|
1097
|
+
// for Closure Compiler "advanced" mode
|
1098
|
+
this['moment'] = moment;
|
911
1099
|
}
|
912
1100
|
/*global define:false */
|
913
1101
|
if (typeof define === "function" && define.amd) {
|
@@ -915,4 +1103,4 @@
|
|
915
1103
|
return moment;
|
916
1104
|
});
|
917
1105
|
}
|
918
|
-
})(Date);
|
1106
|
+
}).call(this, Date);
|