date_format.dart 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. import 'i18n_model.dart';
  2. /// Outputs year as four digits
  3. ///
  4. /// Example:
  5. /// formatDate(new DateTime(2018,8,31), [ymdw]);
  6. /// // => Today
  7. const String ymdw = 'ymdw';
  8. ///
  9. /// Example:
  10. /// formatDate(new DateTime(1989), [yyyy]);
  11. /// // => 1989
  12. const String yyyy = 'yyyy';
  13. /// Outputs year as two digits
  14. ///
  15. /// Example:
  16. /// formatDate(new DateTime(1989), [yy]);
  17. /// // => 89
  18. const String yy = 'yy';
  19. /// Outputs month as two digits
  20. ///
  21. /// Example:
  22. /// formatDate(new DateTime(1989, 11), [mm]);
  23. /// // => 11
  24. /// formatDate(new DateTime(1989, 5), [mm]);
  25. /// // => 05
  26. const String mm = 'mm';
  27. /// Outputs month compactly
  28. ///
  29. /// Example:
  30. /// formatDate(new DateTime(1989, 11), [mm]);
  31. /// // => 11
  32. /// formatDate(new DateTime(1989, 5), [m]);
  33. /// // => 5
  34. const String m = 'm';
  35. /// Outputs month as long name
  36. ///
  37. /// Example:
  38. /// formatDate(new DateTime(1989, 2), [MM]);
  39. /// // => february
  40. const String MM = 'MM';
  41. /// Outputs month as short name
  42. ///
  43. /// Example:
  44. /// formatDate(new DateTime(1989, 2), [M]);
  45. /// // => feb
  46. const String M = 'M';
  47. /// Outputs day as two digits
  48. ///
  49. /// Example:
  50. /// formatDate(new DateTime(1989, 2, 21), [dd]);
  51. /// // => 21
  52. /// formatDate(new DateTime(1989, 2, 5), [dd]);
  53. /// // => 05
  54. const String dd = 'dd';
  55. /// Outputs day compactly
  56. ///
  57. /// Example:
  58. /// formatDate(new DateTime(1989, 2, 21), [d]);
  59. /// // => 21
  60. /// formatDate(new DateTime(1989, 2, 5), [d]);
  61. /// // => 5
  62. const String d = 'd';
  63. /// Outputs week in month
  64. ///
  65. /// Example:
  66. /// formatDate(new DateTime(1989, 2, 21), [w]);
  67. /// // => 4
  68. const String w = 'w';
  69. /// Outputs week in year as two digits
  70. ///
  71. /// Example:
  72. /// formatDate(new DateTime(1989, 12, 31), [W]);
  73. /// // => 53
  74. /// formatDate(new DateTime(1989, 2, 21), [W]);
  75. /// // => 08
  76. const String WW = 'WW';
  77. /// Outputs week in year compactly
  78. ///
  79. /// Example:
  80. /// formatDate(new DateTime(1989, 2, 21), [W]);
  81. /// // => 8
  82. const String W = 'W';
  83. /// Outputs week day as long name
  84. ///
  85. /// Example:
  86. /// formatDate(new DateTime(2018, 1, 14), [D]);
  87. /// // => sun
  88. const String D = 'D';
  89. /// Outputs hour (0 - 11) as two digits
  90. ///
  91. /// Example:
  92. /// formatDate(new DateTime(1989, 02, 1, 15), [hh]);
  93. /// // => 03
  94. const String hh = 'hh';
  95. /// Outputs hour (0 - 11) compactly
  96. ///
  97. /// Example:
  98. /// formatDate(new DateTime(1989, 02, 1, 15), [h]);
  99. /// // => 3
  100. const String h = 'h';
  101. /// Outputs hour (0 to 23) as two digits
  102. ///
  103. /// Example:
  104. /// formatDate(new DateTime(1989, 02, 1, 15), [HH]);
  105. /// // => 15
  106. const String HH = 'HH';
  107. /// Outputs hour (0 to 23) compactly
  108. ///
  109. /// Example:
  110. /// formatDate(new DateTime(1989, 02, 1, 5), [H]);
  111. /// // => 5
  112. const String H = 'H';
  113. /// Outputs minute as two digits
  114. ///
  115. /// Example:
  116. /// formatDate(new DateTime(1989, 02, 1, 15, 40), [nn]);
  117. /// // => 40
  118. /// formatDate(new DateTime(1989, 02, 1, 15, 4), [nn]);
  119. /// // => 04
  120. const String nn = 'nn';
  121. /// Outputs minute compactly
  122. ///
  123. /// Example:
  124. /// formatDate(new DateTime(1989, 02, 1, 15, 4), [n]);
  125. /// // => 4
  126. const String n = 'n';
  127. /// Outputs second as two digits
  128. ///
  129. /// Example:
  130. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10), [ss]);
  131. /// // => 10
  132. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 5), [ss]);
  133. /// // => 05
  134. const String ss = 'ss';
  135. /// Outputs second compactly
  136. ///
  137. /// Example:
  138. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 5), [s]);
  139. /// // => 5
  140. const String s = 's';
  141. /// Outputs millisecond as three digits
  142. ///
  143. /// Example:
  144. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 999), [SSS]);
  145. /// // => 999
  146. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 99), [SS]);
  147. /// // => 099
  148. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0), [SS]);
  149. /// // => 009
  150. const String SSS = 'SSS';
  151. /// Outputs millisecond compactly
  152. ///
  153. /// Example:
  154. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 999), [SSS]);
  155. /// // => 999
  156. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 99), [SS]);
  157. /// // => 99
  158. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 9), [SS]);
  159. /// // => 9
  160. const String S = 'S';
  161. /// Outputs microsecond as three digits
  162. ///
  163. /// Example:
  164. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 999), [uuu]);
  165. /// // => 999
  166. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 99), [uuu]);
  167. /// // => 099
  168. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 9), [uuu]);
  169. /// // => 009
  170. const String uuu = 'uuu';
  171. /// Outputs millisecond compactly
  172. ///
  173. /// Example:
  174. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 999), [u]);
  175. /// // => 999
  176. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 99), [u]);
  177. /// // => 99
  178. /// formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 9), [u]);
  179. /// // => 9
  180. const String u = 'u';
  181. /// Outputs if hour is AM or PM
  182. ///
  183. /// Example:
  184. /// print(formatDate(new DateTime(1989, 02, 1, 5), [am]));
  185. /// // => AM
  186. /// print(formatDate(new DateTime(1989, 02, 1, 15), [am]));
  187. /// // => PM
  188. const String am = 'am';
  189. /// Outputs timezone as time offset
  190. ///
  191. /// Example:
  192. ///
  193. const String z = 'z';
  194. const String Z = 'Z';
  195. String formatDate(DateTime date, List<String> formats, LocaleType locale) {
  196. if (formats.first == ymdw) {
  197. final now = DateTime.now();
  198. if (date.year == now.year &&
  199. date.month == now.month &&
  200. date.day == now.day) {
  201. //today
  202. return i18nObjInLocale(locale)['today'];
  203. } else if (date.year == now.year) {
  204. if (locale == LocaleType.zh) {
  205. return formatDate(date, [mm, '月', dd, '日 ', D], locale);
  206. } else if (locale == LocaleType.nl) {
  207. return formatDate(date, [D, ' ', dd, ' ', M], locale);
  208. } else if (locale == LocaleType.ko) {
  209. return formatDate(date, [mm, '월', dd, '일 ', D], locale);
  210. } else if (locale == LocaleType.de) {
  211. return formatDate(date, [D, ', ', dd, '. ', M], locale);
  212. } else if (locale == LocaleType.id) {
  213. return formatDate(date, [D, ', ', dd, ' ', M], locale);
  214. } else {
  215. return formatDate(date, [D, ' ', M, ' ', dd], locale);
  216. }
  217. } else {
  218. if (locale == LocaleType.zh) {
  219. return formatDate(date, [yyyy, '年', mm, '月', dd, '日 ', D], locale);
  220. } else if (locale == LocaleType.nl) {
  221. return formatDate(date, [D, ' ', dd, ' ', M, ' ', yyyy], locale);
  222. } else if (locale == LocaleType.ko) {
  223. return formatDate(date, [yyyy, '년', mm, '월', dd, '일 ', D], locale);
  224. } else if (locale == LocaleType.de) {
  225. return formatDate(date, [D, ', ', dd, '. ', M, ' ', yyyy], locale);
  226. } else if (locale == LocaleType.id) {
  227. return formatDate(date, [D, ', ', dd, ' ', M, ' ', yyyy], locale);
  228. } else {
  229. return formatDate(date, [D, ' ', M, ' ', dd, ', ', yyyy], locale);
  230. }
  231. }
  232. }
  233. final sb = new StringBuffer();
  234. for (String format in formats) {
  235. if (format == yyyy) {
  236. sb.write(digits(date.year, 4));
  237. } else if (format == yy) {
  238. sb.write(digits(date.year % 100, 2));
  239. } else if (format == mm) {
  240. sb.write(digits(date.month, 2));
  241. } else if (format == m) {
  242. sb.write(date.month);
  243. } else if (format == MM) {
  244. String monthLong = i18nObjInLocale(locale)['monthLong'][date.month - 1];
  245. sb.write(monthLong);
  246. } else if (format == M) {
  247. String monthShort = i18nObjInLocale(locale)['monthShort'][date.month - 1];
  248. sb.write(monthShort);
  249. } else if (format == dd) {
  250. sb.write(digits(date.day, 2));
  251. } else if (format == d) {
  252. sb.write(date.day);
  253. } else if (format == w) {
  254. sb.write((date.day + 7) ~/ 7);
  255. } else if (format == W) {
  256. sb.write((dayInYear(date) + 7) ~/ 7);
  257. } else if (format == WW) {
  258. sb.write(digits((dayInYear(date) + 7) ~/ 7, 2));
  259. } else if (format == D) {
  260. String day = i18nObjInLocale(locale)['day'][date.weekday - 1];
  261. if (locale == LocaleType.ko) {
  262. day = "($day)";
  263. }
  264. sb.write(day);
  265. } else if (format == HH) {
  266. sb.write(digits(date.hour, 2));
  267. } else if (format == H) {
  268. sb.write(date.hour);
  269. } else if (format == hh) {
  270. sb.write(digits(date.hour % 12, 2));
  271. } else if (format == h) {
  272. sb.write(date.hour % 12);
  273. } else if (format == am) {
  274. sb.write(date.hour < 12
  275. ? i18nObjInLocale(locale)['am']
  276. : i18nObjInLocale(locale)['pm']);
  277. } else if (format == nn) {
  278. sb.write(digits(date.minute, 2));
  279. } else if (format == n) {
  280. sb.write(date.minute);
  281. } else if (format == ss) {
  282. sb.write(digits(date.second, 2));
  283. } else if (format == s) {
  284. sb.write(date.second);
  285. } else if (format == SSS) {
  286. sb.write(digits(date.millisecond, 3));
  287. } else if (format == S) {
  288. sb.write(date.second);
  289. } else if (format == uuu) {
  290. sb.write(digits(date.microsecond, 2));
  291. } else if (format == u) {
  292. sb.write(date.microsecond);
  293. } else if (format == z) {
  294. if (date.timeZoneOffset.inMinutes == 0) {
  295. sb.write('Z');
  296. } else {
  297. if (date.timeZoneOffset.isNegative) {
  298. sb.write('-');
  299. sb.write(digits((-date.timeZoneOffset.inHours) % 24, 2));
  300. sb.write(digits((-date.timeZoneOffset.inMinutes) % 60, 2));
  301. } else {
  302. sb.write('+');
  303. sb.write(digits(date.timeZoneOffset.inHours % 24, 2));
  304. sb.write(digits(date.timeZoneOffset.inMinutes % 60, 2));
  305. }
  306. }
  307. } else if (format == Z) {
  308. sb.write(date.timeZoneName);
  309. } else {
  310. sb.write(format);
  311. }
  312. }
  313. return sb.toString();
  314. }
  315. String digits(int value, int length) {
  316. return '$value'.padLeft(length, "0");
  317. }
  318. int dayInYear(DateTime date) =>
  319. date.difference(new DateTime(date.year, 1, 1)).inDays;