We offten need to display date in accordance with some pattern. There is my implementaion of this task for javascript:
SimpleDateFormatter = function() {};
SimpleDateFormatter.zeroize = function (value, length) {
if (!length) length = 2;
value = String(value);
for (var i = 0, zeros = '';
i < (length - value.length); i++) {
zeros += '0';
}
return zeros + value;
};
SimpleDateFormatter.getTimezome = function (date) {
if (!date)
return "";
var dateStr = date + "";
var timezoneIndex = dateStr.indexOf("GMT");
if (timezoneIndex == -1)
timezoneIndex = dateStr.indexOf("UTC");
if (timezoneIndex > 0) {
return dateStr.substring(timezoneIndex, dateStr.length);
}
return "";
}
SimpleDateFormatter.getFromCache = function (pattern){
if (SimpleDateFormatter.cache && SimpleDateFormatter.cache[pattern])
return SimpleDateFormatter.cache[pattern];
return null;
}
SimpleDateFormatter.putToCache = function (pattern, func) {
if (SimpleDateFormatter.cache)
SimpleDateFormatter.cache[pattern] = func;
}
SimpleDateFormatter.formatter = function(pattern)
{
//remove quortes to avoid function compilation problems
pattern = pattern.replace(/'/g, "");
pattern = pattern.replace(/\n/g,"\\n");
var cached = SimpleDateFormatter.getFromCache(pattern);
if (cached)
return cached;
pattern = "'"+pattern+"'";
var funcSrc = pattern.replace(/(yyyy|MMMM|MMM|MM|M|EEEE|EEE|dd|d|hh|h|kk|k|mm|m|ss|s|S|z)/g,
function($1)
{
switch ($1)
{
case 'yyyy': return "'+date.getFullYear()+'";
case 'MMMM': return "'+SimpleDateFormatter.monthNames[date.getMonth()]+'";
case 'MMM': return "'+SimpleDateFormatter.monthNames[date.getMonth()].substr(0, 3)+'";
case 'MM': return "'+SimpleDateFormatter.zeroize(date.getMonth() + 1)+'";
case 'M': return "'+(date.getMonth() + 1)+'";
case 'EEEE': return "'+SimpleDateFormatter.dayNames[date.getDay()]+'";
case 'EEE': return "'+SimpleDateFormatter.dayNames[date.getDay()].substr(0, 3)+'";
case 'dd': return "'+SimpleDateFormatter.zeroize(date.getDate())+'";
case 'd': return "'+date.getDate()+'";
case 'h': return "'+date.getHours()+'";
case 'hh': return "'+SimpleDateFormatter.zeroize(date.getHours())+'";
case 'k': return "'+((h = date.getHours() % 12) ? h : '12')+(date.getHours() < 12 ? 'am' : 'pm')+'";
case 'kk': return "'+SimpleDateFormatter.zeroize((h = date.getHours() % 12) ? h : '12')+(date.getHours() < 12 ? 'am' : 'pm')+'";
case 'mm': return "'+SimpleDateFormatter.zeroize(date.getMinutes())+'";
case 'm': return "'+date.getMinutes()+'";
case 'ss': return "'+SimpleDateFormatter.zeroize(date.getSeconds())+'";
case 's': return "'+date.getSeconds()+'";
case 'S': return "'+date.getMilliseconds()+'";
case 'z': return "'+SimpleDateFormatter.getTimezome(date)+'";
}
}
);
funcSrc = "return "+funcSrc;
var func = new Function("date", funcSrc);
SimpleDateFormatter.putToCache(pattern, func);
return func;
}
// a global month names array
SimpleDateFormatter.monthNames = new Array(
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
);
// a global day names array
SimpleDateFormatter.dayNames = new Array(
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday'
);
//cache: pattern->format function
SimpleDateFormatter.cache = {};
Pattern lettersy Year 1996; 96
M Month in year July; Jul; 07
d Day in month 10
E Day in week Tuesday; Tue
H Hour in day (0-23) 0
K Hour in am/pm (0-11) 0
m Minute in hour (0-59) 30
s Second in minute (0-59) 55
S Millisecond (0-999) 978
z Time zone GMT+04:00
Usage Now you may use it:
var formatter = SimpleDateFormatter.formatter("yyyy/MMM/EEE");//formatter is a function
alert(formatter(new Date()));
We also use cache of formatter, so you could use SimpleDateFormatter.formatter("yyyy/MMM/EEE")(date) everywhere, and formatter function will be created only single time. | Year(yyyy) | Month(M) | Day(d) | Hour(h) | Minutes(m) | Seconds(s) | Milliseconds(S) |
| Pattern | ||||||
No comments:
Post a Comment