本文介绍如何在JavaScript中实现与PHP date()函数功能一致的时间格式化方法。通过定义格式参数和时间戳,利用正则表达式替换和内置日期对象,生成符合特定格式的时间字符串。
JavaScript实现PHP date()函数功能
以下是实现代码:
// 实现与PHP相同的时间戳格式化功能
// @param {string} format 格式字符串
// @param {int} timestamp 需要格式化的时间戳,默认为当前时间
// @return {string} 格式化后的时间字符串
function date ( format, timestamp ) {
var a, jsdate=((timestamp) ? new Date(timestamp*1000) : new Date());
var pad = function(n, c){
if( (n = n + "").length < c ) {
return new Array(++c - n.length).join("0") + n;
} else {
return n;
}
};
var txt_weekdays = ["Sunday","Monday","Tuesday","Wednesday", "Thursday","Friday","Saturday"];
var txt_ordin = {1:"st",2:"nd",3:"rd",21:"st",22:"nd",23:"rd",31:"st"};
var txt_months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var f = {\n // Day\n d: function(){\n return pad(f.j(), 2);\n },\n D: function(){\n t = f.l(); return t.substr(0,3);\n },\n j: function(){\n return jsdate.getDate();\n },\n l: function(){\n return txt_weekdays[f.w()];\n },\n N: function(){\n return f.w() + 1;\n },\n S: function(){\n return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th';\n },\n w: function(){\n return jsdate.getDay();\n },\n z: function(){\n return (jsdate - new Date(jsdate.getFullYear() + "/1/1")) / 864e5 >> 0;\n },
// Week\n W: function(){\n var a = f.z(), b = 364 + f.L() - a;\n var nd2, nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;
if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b){\n return 1;\n } else{
if(a <= 2 && nd >= 4 && a >= (6 - nd)){\n nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");\n return date("W", Math.round(nd2.getTime()/1000));\n } else{\n return (1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);\n }\n }\n },
// Month\n F: function(){\n return txt_months[f.n()];\n },\n m: function(){\n return pad(f.n(), 2);\n },\n M: function(){\n t = f.F(); return t.substr(0,3);\n },\n n: function(){\n return jsdate.getMonth() + 1;\n },\n t: function(){\n var n;\n if( (n = jsdate.getMonth() + 1) == 2 ){\n return 28 + f.L();\n } else{\n if( n & 1 && n < 8 || !(n & 1) && n > 7 ){\n return 31;\n } else{\n return 30;\n }\n }\n },
// Year\n L: function(){\n var y = f.Y();\n return (!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0;\n },\n //o not supported yet\n Y: function(){\n return jsdate.getFullYear();\n },\n y: function(){\n return (jsdate.getFullYear() + "").slice(2);\n },
// Time\n a: function(){\n return jsdate.getHours() > 11 ? "pm" : "am";\n },\n A: function(){\n return f.a().toUpperCase();\n },\n B: function(){\n // peter paul koch:\n var off = (jsdate.getTimezoneOffset() + 60)*60;\n var theSeconds = (jsdate.getHours() * 3600) +\n (jsdate.getMinutes() * 60) +\n jsdate.getSeconds() + off;\n var beat = Math.floor(theSeconds/86.4);\n if (beat > 1000) beat -= 1000;\n if (beat < 0) beat += 1000;\n if ((String(beat)).length == 1) beat = "00"+beat;\n if ((String(beat)).length == 2) beat = "0"+beat;\n return beat;\n },\n g: function(){\n return jsdate.getHours() % 12 || 12;\n },\n G: function(){\n return jsdate.getHours();\n },\n h: function(){\n return pad(f.g(), 2);\n },\n H: function(){\n return pad(jsdate.getHours(), 2);\n },\n i: function(){\n return pad(jsdate.getMinutes(), 2);\n },\n s: function(){\n return pad(jsdate.getSeconds(), 2);\n },\n //u not supported yet
// Timezone\n //e not supported yet\n //I not supported yet\n O: function(){\n var t = pad(Math.abs(jsdate.getTimezoneOffset()/60*100), 4);\n if (jsdate.getTimezoneOffset() > 0) t = "-" + t; else t = "+" + t;\n return t;\n },\n P: function(){\n var O = f.O();\n return (O.substr(0, 3) + ":" + O.substr(3, 2));\n },\n //T not supported yet\n //Z not supported yet
// Full Date/Time\n c: function(){\n return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P();\n },\n //r not supported yet\n U: function(){\n return Math.round(jsdate.getTime()/1000);\n }\n };
return format.replace(/[\\]?([a-zA-Z])/g, function(t, s){\n if( t!=s ){\n // escaped\n ret = s;\n } else if( f[s] ) {\n // a date function exists\n ret = f[s]();\n } else{\n // nothing special\n ret = s;\n }
return ret;\n });\n}