您的位置:首页 > Web前端 > JavaScript

对 meizz javascript date format 日期格式化函数的增强和改写

2012-08-13 14:27 696 查看
meizz的javascript日期格式化函数很好用

原帖请见:http://blog.csdn.net/meizz/article/details/405708

Date.prototype.format = function(format) //author: meizz
{
var o = {
"M+" : this.getMonth()+1, //month
"d+" : this.getDate(),    //day
"h+" : this.getHours(),   //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"q+" : Math.floor((this.getMonth()+3)/3),  //quarter
"S" : this.getMilliseconds() //millisecond
}
if(/(y+)/.test(format)) format=format.replace(RegExp.$1,
(this.getFullYear()+"").substr(4 - RegExp.$1.length));
for(var k in o)if(new RegExp("("+ k +")").test(format))
format = format.replace(RegExp.$1,
RegExp.$1.length==1 ? o[k] :
("00"+ o[k]).substr((""+ o[k]).length));
return format;
}
alert(new Date().format("yyyy-MM-dd hh:mm:ss"));


代码写得很精妙,主要使用了正则和replace,我简单地做了一些增强和改写,

主要用了replace 函数来代替RegExp.$1

增加了24小时表示法的H

原来的h变成12小时制

增加了E代表星期,当然可以再扩展

/*
字母  日期或时间元素  表示  示例
G  Era 标志符  Text  AD
y  年  Year  1996; 96
M  年中的月份  Month  July; Jul; 07
w  年中的周数  Number  27
W  月份中的周数  Number  2
D  年中的天数  Number  189
d  月份中的天数  Number  10
F  月份中的星期  Number  2
E  星期中的天数  Text  Tuesday; Tue
a  Am/pm 标记  Text  PM
H  一天中的小时数(0-23)  Number  0
k  一天中的小时数(1-24)  Number  24
K  am/pm 中的小时数(0-11)  Number  0
h  am/pm 中的小时数(1-12)  Number  12
m  小时中的分钟数  Number  30
s  分钟中的秒数  Number  55
S  毫秒数  Number  978
z  时区  General time zone  Pacific Standard Time; PST; GMT-08:00
Z  时区  RFC 822 time zone  -0800

*/
String.prototype.repeat = function(count, seperator) {
var seperator = seperator || '';
var a = new Array(count);
for (var i = 0; i < count; i++){
a[i] = this;
}
return a.join(seperator);
}

Date.prototype.format = function(style) {
var o = {
"y{4}|y{2}" : this.getFullYear(), //year
"M{1,2}" : this.getMonth() + 1, //month
"d{1,2}" : this.getDate(),      //day
"H{1,2}" : this.getHours(),     //hour
"h{1,2}" : this.getHours()  % 12,  //hour
"m{1,2}" : this.getMinutes(),   //minute
"s{1,2}" : this.getSeconds(),   //second
"E" : this.getDay(),   //day in week
"q" : Math.floor((this.getMonth() + 3) / 3),  //quarter
"S{3}|S{1}"  : this.getMilliseconds() //millisecond
}
for(var k in o ){
style = style.replace(new RegExp("("+ k +")"), function(m){
return ("0".repeat(m.length) + o[k]).substr(("" + o[k]).length);
})
}
return style;
};

document.write(new Date().format('yyyy-MM-dd Qq WE h:mm:ss SSS'));


代码貌似少了一点。

replace函数的功能很强大,从下面这个简单的例程中学习一下:

String.prototype.format = function(){
var args = arguments;
return this.replace(/\{(\d+)\}/g,
function(m,i){
return args[i];
});
}

var a = "I Love {0}, and You Love {1},Where are {0}! {4}";
alert(a.format("You","Me"));

stringObj.replace参数

第一个参数为正则

第二个参数可以是文本,这个很简单,也可以是function,这个就强大了。

这个function 的参数是动态的,有多少个参数呢,m+3呢,m是多少呢,是正则中左括号的个数,如果有一个左括号,那么就有1+3=4个参数

所以最少有3个参数了。

参数1:匹配的子字符串

参数2:查找中捕获的全部结果(往往和第一个相同,如果()在最外面的话)

参数3:查找中捕获的全部结果

..........:查找中捕获的全部结果

参数m+2:在 stringObj 中匹配出现的偏移量

参数m+3:stringObj 本身

这么一讲,很通俗易懂了。

更新:2012/12/13,替换混淆字符串:

var o = "sina"; //原字符串
var re = /s(.+)i(.+)n(.+)a(.+)/g; //原字符串正则
var s = "svserinfonoaction"; //混淆后的字符串
//alert(re.test(s));

var r = s.replace(re,
function(){
var t = arguments[0];
for (var i = 0; i < o.length; i++) {
t = t.replace(arguments[i + 1], "");
}
return t;
});
document.write(r);

这儿有更详细的参考:

http://www.blogjava.net/pingpang/archive/2012/08/12/385342.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息