现在的位置: 首页 > 综合 > 正文

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

2013年09月09日 ⁄ 综合 ⁄ 共 2782字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.