dateFormat.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. var isStr = require('./isStr');
  2. var isDate = require('./isDate');
  3. var toStr = require('./toStr');
  4. var lpad = require('./lpad');
  5. exports = function(date, mask, utc, gmt) {
  6. if (arguments.length === 1 && isStr(date) && !regNum.test(date)) {
  7. mask = date;
  8. date = undefined;
  9. }
  10. date = date || new Date();
  11. if (!isDate(date)) date = new Date(date);
  12. mask = toStr(exports.masks[mask] || mask || exports.masks['default']);
  13. var maskSlice = mask.slice(0, 4);
  14. if (maskSlice === 'UTC:' || maskSlice === 'GMT:') {
  15. mask = mask.slice(4);
  16. utc = true;
  17. if (maskSlice === 'GMT:') gmt = true;
  18. }
  19. var prefix = utc ? 'getUTC' : 'get';
  20. var d = date[prefix + 'Date']();
  21. var D = date[prefix + 'Day']();
  22. var m = date[prefix + 'Month']();
  23. var y = date[prefix + 'FullYear']();
  24. var H = date[prefix + 'Hours']();
  25. var M = date[prefix + 'Minutes']();
  26. var s = date[prefix + 'Seconds']();
  27. var L = date[prefix + 'Milliseconds']();
  28. var o = utc ? 0 : date.getTimezoneOffset();
  29. var flags = {
  30. d: d,
  31. dd: padZero(d),
  32. ddd: exports.i18n.dayNames[D],
  33. dddd: exports.i18n.dayNames[D + 7],
  34. m: m + 1,
  35. mm: padZero(m + 1),
  36. mmm: exports.i18n.monthNames[m],
  37. mmmm: exports.i18n.monthNames[m + 12],
  38. yy: toStr(y).slice(2),
  39. yyyy: y,
  40. h: H % 12 || 12,
  41. hh: padZero(H % 12 || 12),
  42. H: H,
  43. HH: padZero(H),
  44. M: M,
  45. MM: padZero(M),
  46. s: s,
  47. ss: padZero(s),
  48. l: padZero(L, 3),
  49. L: padZero(Math.round(L / 10)),
  50. t: H < 12 ? 'a' : 'p',
  51. tt: H < 12 ? 'am' : 'pm',
  52. T: H < 12 ? 'A' : 'P',
  53. TT: H < 12 ? 'AM' : 'PM',
  54. Z: gmt
  55. ? 'GMT'
  56. : utc
  57. ? 'UTC'
  58. : (toStr(date).match(regTimezone) || [''])
  59. .pop()
  60. .replace(regTimezoneClip, ''),
  61. o:
  62. (o > 0 ? '-' : '+') +
  63. padZero(Math.floor(Math.abs(o) / 60) * 100 + (Math.abs(o) % 60), 4),
  64. S: ['th', 'st', 'nd', 'rd'][
  65. d % 10 > 3 ? 0 : (((d % 100) - (d % 10) != 10) * d) % 10
  66. ]
  67. };
  68. return mask.replace(regToken, function(match) {
  69. if (match in flags) return flags[match];
  70. return match.slice(1, match.length - 1);
  71. });
  72. };
  73. var padZero = function(str) {
  74. var len =
  75. arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
  76. return lpad(toStr(str), len, '0');
  77. };
  78. var regToken = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZWN]|"[^"]*"|'[^']*'/g;
  79. var regTimezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g;
  80. var regNum = /\d/;
  81. var regTimezoneClip = /[^-+\dA-Z]/g;
  82. exports.masks = {
  83. default: 'ddd mmm dd yyyy HH:MM:ss',
  84. shortDate: 'm/d/yy',
  85. mediumDate: 'mmm d, yyyy',
  86. longDate: 'mmmm d, yyyy',
  87. fullDate: 'dddd, mmmm d, yyyy',
  88. shortTime: 'h:MM TT',
  89. mediumTime: 'h:MM:ss TT',
  90. longTime: 'h:MM:ss TT Z',
  91. isoDate: 'yyyy-mm-dd',
  92. isoTime: 'HH:MM:ss',
  93. isoDateTime: "yyyy-mm-dd'T'HH:MM:sso",
  94. isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'",
  95. expiresHeaderFormat: 'ddd, dd mmm yyyy HH:MM:ss Z'
  96. };
  97. exports.i18n = {
  98. dayNames: [
  99. 'Sun',
  100. 'Mon',
  101. 'Tue',
  102. 'Wed',
  103. 'Thu',
  104. 'Fri',
  105. 'Sat',
  106. 'Sunday',
  107. 'Monday',
  108. 'Tuesday',
  109. 'Wednesday',
  110. 'Thursday',
  111. 'Friday',
  112. 'Saturday'
  113. ],
  114. monthNames: [
  115. 'Jan',
  116. 'Feb',
  117. 'Mar',
  118. 'Apr',
  119. 'May',
  120. 'Jun',
  121. 'Jul',
  122. 'Aug',
  123. 'Sep',
  124. 'Oct',
  125. 'Nov',
  126. 'Dec',
  127. 'January',
  128. 'February',
  129. 'March',
  130. 'April',
  131. 'May',
  132. 'June',
  133. 'July',
  134. 'August',
  135. 'September',
  136. 'October',
  137. 'November',
  138. 'December'
  139. ]
  140. };
  141. module.exports = exports;