3 * (c) 2007-2008 Steven Levithan <stevenlevithan.com>
\r
5 * Includes enhancements by Scott Trenda <scott.trenda.net> and Kris Kowal <cixar.com/~kris.kowal/>
\r
7 * Accepts a date, a mask, or a date and a mask.
\r
8 * Returns a formatted version of the given date.
\r
9 * The date defaults to the current date/time.
\r
10 * The mask defaults to dateFormat.masks.default.
\r
12 var dateFormat = function () {
\r
13 var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
\r
14 timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
\r
15 timezoneClip = /[^-+\dA-Z]/g,
\r
16 pad = function (val, len) {
\r
19 while (val.length < len) val = "0" + val;
\r
23 // Regexes and supporting functions are cached through closure
\r
24 return function (date, mask, utc) {
\r
25 var dF = dateFormat;
\r
27 // You can't provide utc if you skip other args (use the "UTC:" mask prefix)
\r
28 if (arguments.length == 1 && (typeof date == "string" || date instanceof String) && !/\d/.test(date)) {
\r
33 // Passing date through Date applies Date.parse, if necessary
\r
34 date = date ? new Date(date) : new Date();
\r
35 if (isNaN(date)) throw new SyntaxError("invalid date");
\r
37 mask = String(dF.masks[mask] || mask || dF.masks["default"]);
\r
39 // Allow setting the utc argument via the mask
\r
40 if (mask.slice(0, 4) == "UTC:") {
\r
41 mask = mask.slice(4);
\r
45 var _ = utc ? "getUTC" : "get",
\r
46 d = date[_ + "Date"](),
\r
47 D = date[_ + "Day"](),
\r
48 m = date[_ + "Month"](),
\r
49 y = date[_ + "FullYear"](),
\r
50 H = date[_ + "Hours"](),
\r
51 M = date[_ + "Minutes"](),
\r
52 s = date[_ + "Seconds"](),
\r
53 L = date[_ + "Milliseconds"](),
\r
54 o = utc ? 0 : date.getTimezoneOffset(),
\r
58 ddd: dF.i18n.dayNames[D],
\r
59 dddd: dF.i18n.dayNames[D + 7],
\r
62 mmm: dF.i18n.monthNames[m],
\r
63 mmmm: dF.i18n.monthNames[m + 12],
\r
64 yy: String(y).slice(2),
\r
67 hh: pad(H % 12 || 12),
\r
75 L: pad(L > 99 ? Math.round(L / 10) : L),
\r
76 t: H < 12 ? "a" : "p",
\r
77 tt: H < 12 ? "am" : "pm",
\r
78 T: H < 12 ? "A" : "P",
\r
79 TT: H < 12 ? "AM" : "PM",
\r
80 Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
\r
81 o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
\r
82 S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
\r
85 return mask.replace(token, function ($0) {
\r
86 return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
\r
91 // Some common format strings
\r
92 dateFormat.masks = {
\r
93 "default": "ddd mmm dd yyyy HH:MM:ss",
\r
94 shortDate: "m/d/yy",
\r
95 mediumDate: "mmm d, yyyy",
\r
96 longDate: "mmmm d, yyyy",
\r
97 fullDate: "dddd, mmmm d, yyyy",
\r
98 shortTime: "h:MM TT",
\r
99 mediumTime: "h:MM:ss TT",
\r
100 longTime: "h:MM:ss TT Z",
\r
101 isoDate: "yyyy-mm-dd",
\r
102 isoTime: "HH:MM:ss",
\r
103 isoDateTime: "yyyy-mm-dd'T'HH:MM:ss",
\r
104 isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
\r
107 // Internationalization strings
\r
108 dateFormat.i18n = {
\r
110 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
\r
111 "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
\r
114 "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
\r
115 "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
\r
119 // For convenience...
\r
120 Date.prototype.format = function (mask, utc) {
\r
121 return dateFormat(this, mask, utc);
\r