@@ -3,42 +3,45 @@ part of angular.formatter_internal;
33/**
44 * Formats a date value to a string based on the requested format.
55 *
6- * Usage:
6+ * # Usage
77 *
88 * date_expression | date[:format]
99 *
10- * Here `format` may be specified explicitly, or by using one of the following predefined
11- * localizable names:
12- *
13- * FORMAT NAME AS DEFINED FOR en_US OUTPUT
14- * ------------- ---------------------- ---------------------------
15- * medium MMM d, y h:mm:ss a Sep 3, 2010 12:05:08 pm
16- * short M/d/yy h:mm a 9/3/10 12:05 pm
17- * fullDate EEEE, MMMM d, y Friday, September 3, 2010
18- * longDate MMMM d, y September 3, 2010
19- * mediumDate MMM d, y Sep 3, 2010
20- * shortDate M/d/yy 9/3/10
21- * mediumTime h:mm:ss a 12:05:08 pm
22- * shortTime h:mm a 12:05 pm
10+ * `format` may be specified explicitly, or by using one of the following predefined shorthand:
2311 *
12+ * FORMAT NAME OUTPUT for en_US
13+ * ------------- ---------------------------
14+ * medium Sep 3, 2010 12:05:08 PM
15+ * short 9/3/10 12:05 PM
16+ * fullDate Friday, September 3, 2010
17+ * longDate September 3, 2010
18+ * mediumDate Sep 3, 2010
19+ * shortDate 9/3/10
20+ * mediumTime 12:05:08 PM
21+ * shortTime 12:05 PM
2422 *
2523 * For more on explicit formatting of dates and date syntax, see the documentation for the
2624 * [DartFormat class] (https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.DateFormat).
2725 *
26+ * # Example
27+ *
28+ * '2014-05-22' | date:'fullDate' // "Thursday, May 22, 2014" for the en_US locale
29+ *
2830 */
2931@Formatter (name: 'date' )
3032class Date implements Function {
31- static final _MAP = const < String , String > {
32- 'medium' : 'MMM d, y h:mm:ss a' ,
33- 'short' : 'M/d/yy h:mm a' ,
34- 'fullDate' : 'EEEE, MMMM d, y' ,
35- 'longDate' : 'MMMM d, y' ,
36- 'mediumDate' : 'MMM d, y' ,
37- 'shortDate' : 'M/d/yy' ,
38- 'mediumTime' : 'h:mm:ss a' ,
39- 'shortTime' : 'h:mm a' ,
33+ static final _PATTERNS = const < String , dynamic > {
34+ 'medium' : const [ DateFormat . YEAR_ABBR_MONTH_DAY , DateFormat . HOUR_MINUTE_SECOND ] ,
35+ 'short' : const [ DateFormat . YEAR_NUM_MONTH_DAY , DateFormat . HOUR_MINUTE ] ,
36+ 'fullDate' : DateFormat . YEAR_MONTH_WEEKDAY_DAY ,
37+ 'longDate' : DateFormat . YEAR_MONTH_DAY ,
38+ 'mediumDate' : DateFormat . YEAR_ABBR_MONTH_DAY ,
39+ 'shortDate' : DateFormat . YEAR_NUM_MONTH_DAY ,
40+ 'mediumTime' : DateFormat . HOUR_MINUTE_SECOND ,
41+ 'shortTime' : DateFormat . HOUR_MINUTE ,
4042 };
4143
44+ /// locale -> (format -> DateFormat)
4245 var _dfs = new Map <String , Map <String , DateFormat >>();
4346
4447 /**
@@ -55,14 +58,26 @@ class Date implements Function {
5558 if (date is String ) date = DateTime .parse (date);
5659 if (date is num ) date = new DateTime .fromMillisecondsSinceEpoch (date);
5760 if (date is ! DateTime ) return date;
58- if (_MAP .containsKey (format)) format = _MAP [format];
5961 var verifiedLocale = Intl .verifiedLocale (Intl .getCurrentLocale (), DateFormat .localeExists);
60- _dfs.putIfAbsent (verifiedLocale, () => new Map <String , DateFormat >());
61- var df = _dfs[verifiedLocale][format];
62- if (df == null ) {
63- df = new DateFormat (format);
64- _dfs[verifiedLocale][format] = df;
62+ return _getDateFormat (verifiedLocale, format).format (date);
63+ }
64+
65+ DateFormat _getDateFormat (String locale, String format) {
66+ _dfs.putIfAbsent (locale, () => < String , DateFormat > {});
67+
68+ if (_dfs[locale][format] == null ) {
69+ var pattern = _PATTERNS .containsKey (format) ? _PATTERNS [format] : format;
70+ if (pattern is ! Iterable ) pattern = [pattern];
71+ var df = new DateFormat ();
72+ pattern.forEach ((p) {
73+ df.addPattern (p);
74+ });
75+ if (format == "short" || format == "shortDate" ) {
76+ // "short" and "shortDate" formats use a 2-digit year
77+ df = new DateFormat (df.pattern.replaceAll (new RegExp ('y+' ), 'yy' ));
78+ }
79+ _dfs[locale][format] = df;
6580 }
66- return df. format (date) ;
81+ return _dfs[locale][ format] ;
6782 }
6883}
0 commit comments