date.format.js
124 lines
| 4.5 KiB
| application/javascript
|
JavascriptLexer
Brian Granger
|
r5874 | /* | |
* Date Format 1.2.3 | |||
* (c) 2007-2009 Steven Levithan <stevenlevithan.com> | |||
* MIT license | |||
* | |||
* Includes enhancements by Scott Trenda <scott.trenda.net> | |||
* and Kris Kowal <cixar.com/~kris.kowal/> | |||
* | |||
* Accepts a date, a mask, or a date and a mask. | |||
* Returns a formatted version of the given date. | |||
* The date defaults to the current date/time. | |||
* The mask defaults to dateFormat.masks.default. | |||
*/ | |||
Jonathan Frederic
|
r17214 | var dateFormat = function () { | |
var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g, | |||
timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, | |||
timezoneClip = /[^-+\dA-Z]/g, | |||
pad = function (val, len) { | |||
val = String(val); | |||
len = len || 2; | |||
while (val.length < len) val = "0" + val; | |||
return val; | |||
}; | |||
Brian Granger
|
r5874 | ||
Jonathan Frederic
|
r17214 | // Regexes and supporting functions are cached through closure | |
return function (date, mask, utc) { | |||
var dF = dateFormat; | |||
Brian Granger
|
r5874 | ||
Jonathan Frederic
|
r17214 | // You can't provide utc if you skip other args (use the "UTC:" mask prefix) | |
if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) { | |||
mask = date; | |||
date = undefined; | |||
} | |||
Brian Granger
|
r5874 | ||
Jonathan Frederic
|
r17214 | // Passing date through Date applies Date.parse, if necessary | |
date = date ? new Date(date) : new Date; | |||
if (isNaN(date)) throw SyntaxError("invalid date"); | |||
Brian Granger
|
r5874 | ||
Jonathan Frederic
|
r17214 | mask = String(dF.masks[mask] || mask || dF.masks["default"]); | |
Brian Granger
|
r5874 | ||
Jonathan Frederic
|
r17214 | // Allow setting the utc argument via the mask | |
if (mask.slice(0, 4) == "UTC:") { | |||
mask = mask.slice(4); | |||
utc = true; | |||
} | |||
Brian Granger
|
r5874 | ||
Jonathan Frederic
|
r17214 | var _ = utc ? "getUTC" : "get", | |
d = date[_ + "Date"](), | |||
D = date[_ + "Day"](), | |||
m = date[_ + "Month"](), | |||
y = date[_ + "FullYear"](), | |||
H = date[_ + "Hours"](), | |||
M = date[_ + "Minutes"](), | |||
s = date[_ + "Seconds"](), | |||
L = date[_ + "Milliseconds"](), | |||
o = utc ? 0 : date.getTimezoneOffset(), | |||
flags = { | |||
d: d, | |||
dd: pad(d), | |||
ddd: dF.i18n.dayNames[D], | |||
dddd: dF.i18n.dayNames[D + 7], | |||
m: m + 1, | |||
mm: pad(m + 1), | |||
mmm: dF.i18n.monthNames[m], | |||
mmmm: dF.i18n.monthNames[m + 12], | |||
yy: String(y).slice(2), | |||
yyyy: y, | |||
h: H % 12 || 12, | |||
hh: pad(H % 12 || 12), | |||
H: H, | |||
HH: pad(H), | |||
M: M, | |||
MM: pad(M), | |||
s: s, | |||
ss: pad(s), | |||
l: pad(L, 3), | |||
L: pad(L > 99 ? Math.round(L / 10) : L), | |||
t: H < 12 ? "a" : "p", | |||
tt: H < 12 ? "am" : "pm", | |||
T: H < 12 ? "A" : "P", | |||
TT: H < 12 ? "AM" : "PM", | |||
Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""), | |||
o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4), | |||
S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10] | |||
}; | |||
Jonathan Frederic
|
r17200 | ||
Jonathan Frederic
|
r17214 | return mask.replace(token, function ($0) { | |
return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1); | |||
}); | |||
Brian Granger
|
r5874 | }; | |
Jonathan Frederic
|
r17214 | }(); | |
Brian Granger
|
r5874 | ||
Jonathan Frederic
|
r17214 | // Some common format strings | |
dateFormat.masks = { | |||
"default": "ddd mmm dd yyyy HH:MM:ss", | |||
shortDate: "m/d/yy", | |||
mediumDate: "mmm d, yyyy", | |||
longDate: "mmmm d, yyyy", | |||
fullDate: "dddd, mmmm d, yyyy", | |||
shortTime: "h:MM TT", | |||
mediumTime: "h:MM:ss TT", | |||
longTime: "h:MM:ss TT Z", | |||
isoDate: "yyyy-mm-dd", | |||
isoTime: "HH:MM:ss", | |||
isoDateTime: "yyyy-mm-dd'T'HH:MM:ss", | |||
isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'" | |||
}; | |||
Brian Granger
|
r5874 | ||
Jonathan Frederic
|
r17214 | // Internationalization strings | |
dateFormat.i18n = { | |||
dayNames: [ | |||
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", | |||
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" | |||
], | |||
monthNames: [ | |||
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", | |||
"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" | |||
] | |||
}; | |||
Brian Granger
|
r5874 | ||
Jonathan Frederic
|
r17214 | // For convenience... | |
Date.prototype.format = function (mask, utc) { | |||
return dateFormat(this, mask, utc); | |||
}; |