@@ -184,6 +184,17 @@ function dateStrGetter(name, shortForm) {
184
184
} ;
185
185
}
186
186
187
+ function timeZoneGetter ( numFormat ) {
188
+ return function ( date ) {
189
+ var timeZone ;
190
+ if ( numFormat || ! ( timeZone = GET_TIME_ZONE . exec ( date . toString ( ) ) ) ) {
191
+ var offset = date . getTimezoneOffset ( ) ;
192
+ return padNumber ( offset / 60 , 2 ) + padNumber ( Math . abs ( offset % 60 ) , 2 ) ;
193
+ }
194
+ return timeZone [ 0 ] ;
195
+ } ;
196
+ }
197
+
187
198
var DAY = 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday' . split ( ',' ) ;
188
199
189
200
var MONTH = 'January,February,March,April,May,June,July,August,September,October,November,December' .
@@ -192,7 +203,8 @@ var MONTH = 'January,February,March,April,May,June,July,August,September,October
192
203
var DATE_FORMATS = {
193
204
yyyy : dateGetter ( 'FullYear' , 4 ) ,
194
205
yy : dateGetter ( 'FullYear' , 2 , 0 , true ) ,
195
- MMMMM : dateStrGetter ( 'Month' ) ,
206
+ y : dateGetter ( 'FullYear' , 1 ) ,
207
+ MMMM : dateStrGetter ( 'Month' ) ,
196
208
MMM : dateStrGetter ( 'Month' , true ) ,
197
209
MM : dateGetter ( 'Month' , 2 , 1 ) ,
198
210
M : dateGetter ( 'Month' , 1 , 1 ) ,
@@ -209,14 +221,26 @@ var DATE_FORMATS = {
209
221
EEEE : dateStrGetter ( 'Day' ) ,
210
222
EEE : dateStrGetter ( 'Day' , true ) ,
211
223
a : function ( date ) { return date . getHours ( ) < 12 ? 'am' : 'pm' ; } ,
212
- Z : function ( date ) {
213
- var offset = date . getTimezoneOffset ( ) ;
214
- return padNumber ( offset / 60 , 2 ) + padNumber ( Math . abs ( offset % 60 ) , 2 ) ;
215
- }
224
+ z : timeZoneGetter ( false ) ,
225
+ Z : timeZoneGetter ( true )
216
226
} ;
217
227
228
+ var DEFAULT_DATETIME_FORMATS = {
229
+ long : 'MMMM d, y h:mm:ss a z' ,
230
+ medium : 'MMM d, y h:mm:ss a' ,
231
+ short : 'M/d/yy h:mm a' ,
232
+ fullDate : 'EEEE, MMMM d, y' ,
233
+ longDate : 'MMMM d, y' ,
234
+ mediumDate : 'MMM d, y' ,
235
+ shortDate : 'M/d/yy' ,
236
+ longTime : 'h:mm:ss a z' ,
237
+ mediumTime : 'h:mm:ss a' ,
238
+ shortTime : 'h:mm a'
239
+ } ;
218
240
219
- var DATE_FORMATS_SPLIT = / ( [ ^ y M d H h m s a Z E ] * ) ( E + | y + | M + | d + | H + | h + | m + | s + | a | Z ) ( .* ) / ;
241
+ var GET_TIME_ZONE = / [ A - Z ] { 3 } (? ! [ + \- ] ) / ;
242
+ var DATE_FORMATS_SPLIT = / ( [ ^ y M d H h m s a z Z E ] * ) ( E + | y + | M + | d + | H + | h + | m + | s + | a | Z | z ) ( .* ) / ;
243
+ var OPERA_TOSTRING_PATTERN = / ^ [ \d ] .* Z $ / ;
220
244
var NUMBER_STRING = / ^ \d + $ / ;
221
245
222
246
@@ -231,9 +255,10 @@ var NUMBER_STRING = /^\d+$/;
231
255
*
232
256
* `format` string can be composed of the following elements:
233
257
*
234
- * * `'yyyy'`: 4 digit representation of year e.g. 2010
235
- * * `'yy'`: 2 digit representation of year, padded (00-99)
236
- * * `'MMMMM'`: Month in year (January‒December)
258
+ * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)
259
+ * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)
260
+ * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)
261
+ * * `'MMMM'`: Month in year (January‒December)
237
262
* * `'MMM'`: Month in year (Jan - Dec)
238
263
* * `'MM'`: Month in year, padded (01‒12)
239
264
* * `'M'`: Month in year (1‒12)
@@ -251,22 +276,45 @@ var NUMBER_STRING = /^\d+$/;
251
276
* * `'s'`: Second in minute (0‒59)
252
277
* * `'a'`: am/pm marker
253
278
* * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200‒1200)
279
+ * * `'z'`: short form of current timezone name (e.g. PDT)
280
+ *
281
+ * `format` string can also be the following default formats for `en_US` locale (support for other
282
+ * locales will be added in the future versions):
283
+ *
284
+ * * `'long'`: equivalent to `'MMMM d, y h:mm:ss a z'` for en_US locale
285
+ * (e.g. September 3, 2010 12:05:08 pm PDT)
286
+ * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale
287
+ * (e.g. Sep 3, 2010 12:05:08 pm)
288
+ * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 pm)
289
+ * * `'fullDate'`: equivalent to `'EEEE, MMMM d,y'` for en_US locale
290
+ * (e.g. Friday, September 3, 2010)
291
+ * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010
292
+ * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010)
293
+ * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)
294
+ * * `'longTime'`: equivalent to `'h:mm:ss a z'` for en_US locale (e.g. 12:05:08 pm PDT)
295
+ * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 pm)
296
+ * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 pm)
254
297
*
255
298
* @param {(Date|number|string) } date Date to format either as Date object, milliseconds (string or
256
299
* number) or ISO 8601 extended datetime string (yyyy-MM-ddTHH:mm:ss.SSSZ).
257
- * @param {string= } format Formatting rules. If not specified, Date#toLocaleDateString is used.
300
+ * @param {string= } format Formatting rules (see Description). If not specified,
301
+ * Date#toLocaleDateString is used.
258
302
* @returns {string } Formatted string or the input if input is not recognized as date/millis.
259
303
*
260
304
* @example
261
305
<doc:example>
262
306
<doc:source>
307
+ <span ng:non-bindable>{{1288323623006 | date:'medium'}}</span>:
308
+ {{1288323623006 | date:'medium'}}<br/>
263
309
<span ng:non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:
264
310
{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}<br/>
265
311
<span ng:non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma' }}</span>:
266
312
{{'1288323623006' | date:'MM/dd/yyyy @ h:mma' }}<br/>
267
313
</doc:source>
268
314
<doc:scenario>
269
315
it('should format date', function(){
316
+ expect(binding("1288323623006 | date:'medium'")).
317
+ toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} pm/);
270
318
expect(binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).
271
319
toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} \-?\d{4}/);
272
320
expect(binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).
@@ -276,6 +324,7 @@ var NUMBER_STRING = /^\d+$/;
276
324
</doc:example>
277
325
*/
278
326
angularFilter . date = function ( date , format ) {
327
+ format = DEFAULT_DATETIME_FORMATS [ format ] || format ;
279
328
if ( isString ( date ) ) {
280
329
if ( NUMBER_STRING . test ( date ) ) {
281
330
date = parseInt ( date , 10 ) ;
0 commit comments