| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352 |
- import 'i18n_model.dart';
- /// Outputs year as four digits
- ///
- /// Example:
- /// formatDate(new DateTime(2018,8,31), [ymdw]);
- /// // => Today
- const String ymdw = 'ymdw';
- ///
- /// Example:
- /// formatDate(new DateTime(1989), [yyyy]);
- /// // => 1989
- const String yyyy = 'yyyy';
- /// Outputs year as two digits
- ///
- /// Example:
- /// formatDate(new DateTime(1989), [yy]);
- /// // => 89
- const String yy = 'yy';
- /// Outputs month as two digits
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 11), [mm]);
- /// // => 11
- /// formatDate(new DateTime(1989, 5), [mm]);
- /// // => 05
- const String mm = 'mm';
- /// Outputs month compactly
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 11), [mm]);
- /// // => 11
- /// formatDate(new DateTime(1989, 5), [m]);
- /// // => 5
- const String m = 'm';
- /// Outputs month as long name
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 2), [MM]);
- /// // => february
- const String MM = 'MM';
- /// Outputs month as short name
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 2), [M]);
- /// // => feb
- const String M = 'M';
- /// Outputs day as two digits
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 2, 21), [dd]);
- /// // => 21
- /// formatDate(new DateTime(1989, 2, 5), [dd]);
- /// // => 05
- const String dd = 'dd';
- /// Outputs day compactly
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 2, 21), [d]);
- /// // => 21
- /// formatDate(new DateTime(1989, 2, 5), [d]);
- /// // => 5
- const String d = 'd';
- /// Outputs week in month
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 2, 21), [w]);
- /// // => 4
- const String w = 'w';
- /// Outputs week in year as two digits
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 12, 31), [W]);
- /// // => 53
- /// formatDate(new DateTime(1989, 2, 21), [W]);
- /// // => 08
- const String WW = 'WW';
- /// Outputs week in year compactly
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 2, 21), [W]);
- /// // => 8
- const String W = 'W';
- /// Outputs week day as long name
- ///
- /// Example:
- /// formatDate(new DateTime(2018, 1, 14), [D]);
- /// // => sun
- const String D = 'D';
- /// Outputs hour (0 - 11) as two digits
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 02, 1, 15), [hh]);
- /// // => 03
- const String hh = 'hh';
- /// Outputs hour (0 - 11) compactly
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 02, 1, 15), [h]);
- /// // => 3
- const String h = 'h';
- /// Outputs hour (0 to 23) as two digits
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 02, 1, 15), [HH]);
- /// // => 15
- const String HH = 'HH';
- /// Outputs hour (0 to 23) compactly
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 02, 1, 5), [H]);
- /// // => 5
- const String H = 'H';
- /// Outputs minute as two digits
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 02, 1, 15, 40), [nn]);
- /// // => 40
- /// formatDate(new DateTime(1989, 02, 1, 15, 4), [nn]);
- /// // => 04
- const String nn = 'nn';
- /// Outputs minute compactly
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 02, 1, 15, 4), [n]);
- /// // => 4
- const String n = 'n';
- /// Outputs second as two digits
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10), [ss]);
- /// // => 10
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 5), [ss]);
- /// // => 05
- const String ss = 'ss';
- /// Outputs second compactly
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 5), [s]);
- /// // => 5
- const String s = 's';
- /// Outputs millisecond as three digits
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 999), [SSS]);
- /// // => 999
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 99), [SS]);
- /// // => 099
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0), [SS]);
- /// // => 009
- const String SSS = 'SSS';
- /// Outputs millisecond compactly
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 999), [SSS]);
- /// // => 999
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 99), [SS]);
- /// // => 99
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 9), [SS]);
- /// // => 9
- const String S = 'S';
- /// Outputs microsecond as three digits
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 999), [uuu]);
- /// // => 999
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 99), [uuu]);
- /// // => 099
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 9), [uuu]);
- /// // => 009
- const String uuu = 'uuu';
- /// Outputs millisecond compactly
- ///
- /// Example:
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 999), [u]);
- /// // => 999
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 99), [u]);
- /// // => 99
- /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 9), [u]);
- /// // => 9
- const String u = 'u';
- /// Outputs if hour is AM or PM
- ///
- /// Example:
- /// print(formatDate(new DateTime(1989, 02, 1, 5), [am]));
- /// // => AM
- /// print(formatDate(new DateTime(1989, 02, 1, 15), [am]));
- /// // => PM
- const String am = 'am';
- /// Outputs timezone as time offset
- ///
- /// Example:
- ///
- const String z = 'z';
- const String Z = 'Z';
- String formatDate(DateTime date, List<String> formats, LocaleType locale) {
- if (formats.first == ymdw) {
- final now = DateTime.now();
- if (date.year == now.year &&
- date.month == now.month &&
- date.day == now.day) {
- //today
- return i18nObjInLocale(locale)['today'];
- } else if (date.year == now.year) {
- if (locale == LocaleType.zh) {
- return formatDate(date, [mm, '月', dd, '日 ', D], locale);
- } else if (locale == LocaleType.nl) {
- return formatDate(date, [D, ' ', dd, ' ', M], locale);
- } else if (locale == LocaleType.ko) {
- return formatDate(date, [mm, '월', dd, '일 ', D], locale);
- } else if (locale == LocaleType.de) {
- return formatDate(date, [D, ', ', dd, '. ', M], locale);
- } else if (locale == LocaleType.id) {
- return formatDate(date, [D, ', ', dd, ' ', M], locale);
- } else {
- return formatDate(date, [D, ' ', M, ' ', dd], locale);
- }
- } else {
- if (locale == LocaleType.zh) {
- return formatDate(date, [yyyy, '年', mm, '月', dd, '日 ', D], locale);
- } else if (locale == LocaleType.nl) {
- return formatDate(date, [D, ' ', dd, ' ', M, ' ', yyyy], locale);
- } else if (locale == LocaleType.ko) {
- return formatDate(date, [yyyy, '년', mm, '월', dd, '일 ', D], locale);
- } else if (locale == LocaleType.de) {
- return formatDate(date, [D, ', ', dd, '. ', M, ' ', yyyy], locale);
- } else if (locale == LocaleType.id) {
- return formatDate(date, [D, ', ', dd, ' ', M, ' ', yyyy], locale);
- } else {
- return formatDate(date, [D, ' ', M, ' ', dd, ', ', yyyy], locale);
- }
- }
- }
- final sb = new StringBuffer();
- for (String format in formats) {
- if (format == yyyy) {
- sb.write(digits(date.year, 4));
- } else if (format == yy) {
- sb.write(digits(date.year % 100, 2));
- } else if (format == mm) {
- sb.write(digits(date.month, 2));
- } else if (format == m) {
- sb.write(date.month);
- } else if (format == MM) {
- String monthLong = i18nObjInLocale(locale)['monthLong'][date.month - 1];
- sb.write(monthLong);
- } else if (format == M) {
- String monthShort = i18nObjInLocale(locale)['monthShort'][date.month - 1];
- sb.write(monthShort);
- } else if (format == dd) {
- sb.write(digits(date.day, 2));
- } else if (format == d) {
- sb.write(date.day);
- } else if (format == w) {
- sb.write((date.day + 7) ~/ 7);
- } else if (format == W) {
- sb.write((dayInYear(date) + 7) ~/ 7);
- } else if (format == WW) {
- sb.write(digits((dayInYear(date) + 7) ~/ 7, 2));
- } else if (format == D) {
- String day = i18nObjInLocale(locale)['day'][date.weekday - 1];
- if (locale == LocaleType.ko) {
- day = "($day)";
- }
- sb.write(day);
- } else if (format == HH) {
- sb.write(digits(date.hour, 2));
- } else if (format == H) {
- sb.write(date.hour);
- } else if (format == hh) {
- sb.write(digits(date.hour % 12, 2));
- } else if (format == h) {
- sb.write(date.hour % 12);
- } else if (format == am) {
- sb.write(date.hour < 12
- ? i18nObjInLocale(locale)['am']
- : i18nObjInLocale(locale)['pm']);
- } else if (format == nn) {
- sb.write(digits(date.minute, 2));
- } else if (format == n) {
- sb.write(date.minute);
- } else if (format == ss) {
- sb.write(digits(date.second, 2));
- } else if (format == s) {
- sb.write(date.second);
- } else if (format == SSS) {
- sb.write(digits(date.millisecond, 3));
- } else if (format == S) {
- sb.write(date.second);
- } else if (format == uuu) {
- sb.write(digits(date.microsecond, 2));
- } else if (format == u) {
- sb.write(date.microsecond);
- } else if (format == z) {
- if (date.timeZoneOffset.inMinutes == 0) {
- sb.write('Z');
- } else {
- if (date.timeZoneOffset.isNegative) {
- sb.write('-');
- sb.write(digits((-date.timeZoneOffset.inHours) % 24, 2));
- sb.write(digits((-date.timeZoneOffset.inMinutes) % 60, 2));
- } else {
- sb.write('+');
- sb.write(digits(date.timeZoneOffset.inHours % 24, 2));
- sb.write(digits(date.timeZoneOffset.inMinutes % 60, 2));
- }
- }
- } else if (format == Z) {
- sb.write(date.timeZoneName);
- } else {
- sb.write(format);
- }
- }
- return sb.toString();
- }
- String digits(int value, int length) {
- return '$value'.padLeft(length, "0");
- }
- int dayInYear(DateTime date) =>
- date.difference(new DateTime(date.year, 1, 1)).inDays;
|