date_format_util.dart 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. /// Outputs year as four digits
  2. ///
  3. /// Example:
  4. /// formatDate(DateTime(1989), [yyyy]);
  5. /// // => 1989
  6. const String yyyy = 'yyyy';
  7. /// Outputs year as two digits
  8. ///
  9. /// Example:
  10. /// formatDate(DateTime(1989), [yy]);
  11. /// // => 89
  12. const String yy = 'yy';
  13. /// Outputs month as two digits
  14. ///
  15. /// Example:
  16. /// formatDate(DateTime(1989, 11), [mm]);
  17. /// // => 11
  18. /// formatDate(DateTime(1989, 5), [mm]);
  19. /// // => 05
  20. const String mm = 'mm';
  21. /// Outputs month compactly
  22. ///
  23. /// Example:
  24. /// formatDate(DateTime(1989, 11), [mm]);
  25. /// // => 11
  26. /// formatDate(DateTime(1989, 5), [m]);
  27. /// // => 5
  28. const String m = 'm';
  29. /// Outputs month as long name
  30. ///
  31. /// Example:
  32. /// formatDate(DateTime(1989, 2), [MM]);
  33. /// // => february
  34. const String MM = 'MM';
  35. /// Outputs month as short name
  36. ///
  37. /// Example:
  38. /// formatDate(DateTime(1989, 2), [M]);
  39. /// // => feb
  40. const String M = 'M';
  41. /// Outputs day as two digits
  42. ///
  43. /// Example:
  44. /// formatDate(DateTime(1989, 2, 21), [dd]);
  45. /// // => 21
  46. /// formatDate(DateTime(1989, 2, 5), [dd]);
  47. /// // => 05
  48. const String dd = 'dd';
  49. /// Outputs day compactly
  50. ///
  51. /// Example:
  52. /// formatDate(DateTime(1989, 2, 21), [d]);
  53. /// // => 21
  54. /// formatDate(DateTime(1989, 2, 5), [d]);
  55. /// // => 5
  56. const String d = 'd';
  57. /// Outputs week in month
  58. ///
  59. /// Example:
  60. /// formatDate(DateTime(1989, 2, 21), [w]);
  61. /// // => 4
  62. const String w = 'w';
  63. /// Outputs week in year as two digits
  64. ///
  65. /// Example:
  66. /// formatDate(DateTime(1989, 12, 31), [W]);
  67. /// // => 53
  68. /// formatDate(DateTime(1989, 2, 21), [W]);
  69. /// // => 08
  70. const String WW = 'WW';
  71. /// Outputs week in year compactly
  72. ///
  73. /// Example:
  74. /// formatDate(DateTime(1989, 2, 21), [W]);
  75. /// // => 8
  76. const String W = 'W';
  77. /// Outputs week day as long name
  78. ///
  79. /// Example:
  80. /// formatDate(DateTime(2018, 1, 14), [DD]);
  81. /// // => sunday
  82. const String DD = 'DD';
  83. /// Outputs week day as long name
  84. ///
  85. /// Example:
  86. /// formatDate(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(DateTime(1989, 02, 1, 15), [hh]);
  93. /// // => 03
  94. const String hh = 'hh';
  95. /// Outputs hour (0 - 11) compactly
  96. ///
  97. /// Example:
  98. /// formatDate(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(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(DateTime(1989, 02, 1, 5), [H]);
  111. /// // => 5
  112. const String H = 'H';
  113. /// Outputs minute as two digits
  114. ///
  115. /// Example:
  116. /// formatDate(DateTime(1989, 02, 1, 15, 40), [nn]);
  117. /// // => 40
  118. /// formatDate(DateTime(1989, 02, 1, 15, 4), [nn]);
  119. /// // => 04
  120. const String nn = 'nn';
  121. /// Outputs minute compactly
  122. ///
  123. /// Example:
  124. /// formatDate(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(DateTime(1989, 02, 1, 15, 40, 10), [ss]);
  131. /// // => 10
  132. /// formatDate(DateTime(1989, 02, 1, 15, 40, 5), [ss]);
  133. /// // => 05
  134. const String ss = 'ss';
  135. /// Outputs second compactly
  136. ///
  137. /// Example:
  138. /// formatDate(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(DateTime(1989, 02, 1, 15, 40, 10, 999), [SSS]);
  145. /// // => 999
  146. /// formatDate(DateTime(1989, 02, 1, 15, 40, 10, 99), [SS]);
  147. /// // => 099
  148. /// formatDate(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(DateTime(1989, 02, 1, 15, 40, 10, 999), [SSS]);
  155. /// // => 999
  156. /// formatDate(DateTime(1989, 02, 1, 15, 40, 10, 99), [SS]);
  157. /// // => 99
  158. /// formatDate(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(DateTime(1989, 02, 1, 15, 40, 10, 0, 999), [uuu]);
  165. /// // => 999
  166. /// formatDate(DateTime(1989, 02, 1, 15, 40, 10, 0, 99), [uuu]);
  167. /// // => 099
  168. /// formatDate(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(DateTime(1989, 02, 1, 15, 40, 10, 0, 999), [u]);
  175. /// // => 999
  176. /// formatDate(DateTime(1989, 02, 1, 15, 40, 10, 0, 99), [u]);
  177. /// // => 99
  178. /// formatDate(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(DateTime(1989, 02, 1, 5), [am]));
  185. /// // => AM
  186. /// print(formatDate(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 dateFormat(DateTime date, List<String> formats) {
  196. final sb = StringBuffer();
  197. for (String format in formats) {
  198. if (format == yyyy) {
  199. sb.write(_digits(date.year, 4));
  200. } else if (format == yy) {
  201. sb.write(_digits(date.year % 100, 2));
  202. } else if (format == mm) {
  203. sb.write(_digits(date.month, 2));
  204. } else if (format == m) {
  205. sb.write(date.month);
  206. } else if (format == MM) {
  207. sb.write(monthLong[date.month - 1]);
  208. } else if (format == M) {
  209. sb.write(monthShort[date.month - 1]);
  210. } else if (format == dd) {
  211. sb.write(_digits(date.day, 2));
  212. } else if (format == d) {
  213. sb.write(date.day);
  214. } else if (format == w) {
  215. sb.write((date.day + 7) ~/ 7);
  216. } else if (format == W) {
  217. sb.write((dayInYear(date) + 7) ~/ 7);
  218. } else if (format == WW) {
  219. sb.write(_digits((dayInYear(date) + 7) ~/ 7, 2));
  220. } else if (format == DD) {
  221. sb.write(dayLong[date.weekday - 1]);
  222. } else if (format == D) {
  223. sb.write(dayShort[date.weekday - 1]);
  224. } else if (format == HH) {
  225. sb.write(_digits(date.hour, 2));
  226. } else if (format == H) {
  227. sb.write(date.hour);
  228. } else if (format == hh) {
  229. int hour = date.hour % 12;
  230. if (hour == 0) hour = 12;
  231. sb.write(_digits(hour, 2));
  232. } else if (format == h) {
  233. int hour = date.hour % 12;
  234. if (hour == 0) hour = 12;
  235. sb.write(hour);
  236. } else if (format == am) {
  237. sb.write(date.hour < 12 ? 'AM' : 'PM');
  238. } else if (format == nn) {
  239. sb.write(_digits(date.minute, 2));
  240. } else if (format == n) {
  241. sb.write(date.minute);
  242. } else if (format == ss) {
  243. sb.write(_digits(date.second, 2));
  244. } else if (format == s) {
  245. sb.write(date.second);
  246. } else if (format == SSS) {
  247. sb.write(_digits(date.millisecond, 3));
  248. } else if (format == S) {
  249. sb.write(date.second);
  250. } else if (format == uuu) {
  251. sb.write(_digits(date.microsecond, 2));
  252. } else if (format == u) {
  253. sb.write(date.microsecond);
  254. } else if (format == z) {
  255. if (date.timeZoneOffset.inMinutes == 0) {
  256. sb.write('Z');
  257. } else {
  258. if (date.timeZoneOffset.isNegative) {
  259. sb.write('-');
  260. sb.write(_digits((-date.timeZoneOffset.inHours) % 24, 2));
  261. sb.write(_digits((-date.timeZoneOffset.inMinutes) % 60, 2));
  262. } else {
  263. sb.write('+');
  264. sb.write(_digits(date.timeZoneOffset.inHours % 24, 2));
  265. sb.write(_digits(date.timeZoneOffset.inMinutes % 60, 2));
  266. }
  267. }
  268. } else if (format == Z) {
  269. sb.write(date.timeZoneName);
  270. } else {
  271. sb.write(format);
  272. }
  273. }
  274. return sb.toString();
  275. }
  276. String _digits(int value, int length) {
  277. String ret = '$value';
  278. if (ret.length < length) {
  279. ret = '0' * (length - ret.length) + ret;
  280. }
  281. return ret;
  282. }
  283. const List<String> monthShort = const <String>[
  284. 'Jan',
  285. 'Feb',
  286. 'Mar',
  287. 'Apr',
  288. 'May',
  289. 'Jun',
  290. 'Jul',
  291. 'Aug',
  292. 'Sep',
  293. 'Oct',
  294. 'Nov',
  295. 'Dec'
  296. ];
  297. const List<String> monthLong = const <String>[
  298. 'January',
  299. 'February',
  300. 'March',
  301. 'April',
  302. 'May',
  303. 'June',
  304. 'July',
  305. 'August',
  306. 'September',
  307. 'October',
  308. 'November',
  309. 'December'
  310. ];
  311. const List<String> dayShort = const [
  312. 'Mon',
  313. 'Tue',
  314. 'Wed',
  315. 'Thur',
  316. 'Fri',
  317. 'Sat',
  318. 'Sun'
  319. ];
  320. const List<String> dayLong = const [
  321. 'Monday',
  322. 'Tuesday',
  323. 'Wednesday',
  324. 'Thursday',
  325. 'Friday',
  326. 'Saturday',
  327. 'Sunday'
  328. ];
  329. int dayInYear(DateTime date) =>
  330. date.difference(DateTime(date.year, 1, 1)).inDays;