@@ -7,38 +7,38 @@ part of angular.formatter_internal;
7
7
*
8
8
* {{ date_expression | date[:format] }}
9
9
*
10
- * Here `format` may be specified explicitly, or by using one of the following predefined
11
- * localizable names:
10
+ * `format` may be specified explicitly, or by using one of the following predefined shorthand:
12
11
*
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
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
23
22
*
24
23
*
25
24
* For more on explicit formatting of dates and date syntax, see the documentation for the
26
- * [DartFormat class] (http ://api.dartlang.org/docs/releases/latest/ intl/DateFormat.html ).
25
+ * [DartFormat class] (https ://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/ intl/intl.DateFormat ).
27
26
*
28
27
*/
29
28
@Formatter (name: 'date' )
30
29
class 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' ,
30
+ static final _PATTERNS = const < String , dynamic > {
31
+ 'medium' : const [ DateFormat . YEAR_ABBR_MONTH_DAY , DateFormat . HOUR_MINUTE_SECOND ] ,
32
+ 'short' : const [ DateFormat . YEAR_NUM_MONTH_DAY , DateFormat . HOUR_MINUTE ] ,
33
+ 'fullDate' : DateFormat . YEAR_MONTH_WEEKDAY_DAY ,
34
+ 'longDate' : DateFormat . YEAR_MONTH_DAY ,
35
+ 'mediumDate' : DateFormat . YEAR_ABBR_MONTH_DAY ,
36
+ 'shortDate' : DateFormat . YEAR_NUM_MONTH_DAY ,
37
+ 'mediumTime' : DateFormat . HOUR_MINUTE_SECOND ,
38
+ 'shortTime' : DateFormat . HOUR_MINUTE ,
40
39
};
41
40
41
+ /// locale -> (format -> DateFormat)
42
42
var _dfs = new Map <String , Map <String , DateFormat >>();
43
43
44
44
/**
@@ -55,14 +55,26 @@ class Date implements Function {
55
55
if (date is String ) date = DateTime .parse (date);
56
56
if (date is num ) date = new DateTime .fromMillisecondsSinceEpoch (date);
57
57
if (date is ! DateTime ) return date;
58
- if (_MAP .containsKey (format)) format = _MAP [format];
59
58
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;
59
+ return _getDateFormat (verifiedLocale, format).format (date);
60
+ }
61
+
62
+ DateFormat _getDateFormat (String locale, String format) {
63
+ _dfs.putIfAbsent (locale, () => < String , DateFormat > {});
64
+
65
+ if (_dfs[locale][format] == null ) {
66
+ var pattern = _PATTERNS .containsKey (format) ? _PATTERNS [format] : format;
67
+ if (pattern is ! Iterable ) pattern = [pattern];
68
+ var df = new DateFormat ();
69
+ pattern.forEach ((p) {
70
+ df.addPattern (p);
71
+ });
72
+ if (format == "short" || format == "shortDate" ) {
73
+ // "short" and "shortDate" formats use a 2-digit year
74
+ df = new DateFormat (df.pattern.replaceAll (new RegExp ('y+' ), 'yy' ));
75
+ }
76
+ _dfs[locale][format] = df;
65
77
}
66
- return df. format (date) ;
78
+ return _dfs[locale][ format] ;
67
79
}
68
80
}
0 commit comments