@@ -3,42 +3,45 @@ part of angular.formatter_internal;
3
3
/**
4
4
* Formats a date value to a string based on the requested format.
5
5
*
6
- * Usage:
6
+ * # Usage
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:
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:
23
11
*
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
24
22
*
25
23
* For more on explicit formatting of dates and date syntax, see the documentation for the
26
24
* [DartFormat class] (https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.DateFormat).
27
25
*
26
+ * # Example
27
+ *
28
+ * '2014-05-22' | date:'fullDate' // "Thursday, May 22, 2014" for the en_US locale
29
+ *
28
30
*/
29
31
@Formatter (name: 'date' )
30
32
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' ,
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 ,
40
42
};
41
43
44
+ /// locale -> (format -> DateFormat)
42
45
var _dfs = new Map <String , Map <String , DateFormat >>();
43
46
44
47
/**
@@ -55,14 +58,26 @@ class Date implements Function {
55
58
if (date is String ) date = DateTime .parse (date);
56
59
if (date is num ) date = new DateTime .fromMillisecondsSinceEpoch (date);
57
60
if (date is ! DateTime ) return date;
58
- if (_MAP .containsKey (format)) format = _MAP [format];
59
61
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;
65
80
}
66
- return df. format (date) ;
81
+ return _dfs[locale][ format] ;
67
82
}
68
83
}
0 commit comments