#### 1.1.2 JavaScript日期函数strftime(1)
很多编程语言都提供strftime或类似的函数。它对日期或时间戳进行操作,接受一个格式字符串,然后产生一个代表该日期的格式化字符串。例如,在Ruby中,提供strftime作为对时间或日期对象的方法,在清单1.1中我们给出它的使用实例。
清单1.1 Ruby中的Time#strftime
~~~
Time.now.strftime("Printed on %m/%d/%Y")
#=>"Printed on 09/09/2010"
~~~
清单1.2中给出了在JavaScript中实现strftime的最初版本。它是在Date.prototype上实现的,因此所有的日期对象都会有这个方法。这里需要提醒的是,如果您读不懂本章的代码也没关系。概念比实际的代码要重要,我们将会在第2章中讨论最先进的技巧。
清单1.2 JavaScript strftime的起点
~~~
Date.prototype.strftime =(function (){
function strftime(format){
var date =this;
return (format +"").replace(/%([a-zA-Z ])/g,
function (m,f){
var formatter =Date.formats &&Date.formats [f];
if (typeof formatter =="function"){
return formatter.call(Date.formats,date);
}else if (typeof formatter =="string"){
return date.strftime(formatter);
}
return f;
});
}
//Internal helper
function zeroPad(num){
return (+num <10 ?"0":"")+num;
}
Date.formats ={
//Formatting methods
d:function (date){
return zeroPad(date.getDate());
},
m:function (date){
return zeroPad(date.getMonth()+1);
},
y:function (date){
return date.getYear()%100;
},
Y:function (date){
return date.getFullYear();
},
//Format shorthands
F:"%Y-%m-%d",
D:"%m/%d/%y"
};
return strftime;
}());
~~~
Date.prototype.strftime函数主要有两部分:
首先,replace函数用于把格式说明符替换成它们相应的值,紧接着,Date.formats对象则是一组帮助函数。它可以分解如下:
Date.formats是一个对象,以格式说明符为关键字,由方法从日期中取出相应的数据作为值。
有些格式说明符只是为了方便,作为长格式的捷径。
String.prototype.replace和一个用于匹配格式说明符的正则表达式一起使用。
replacer函数检查在Date.formats中是否有给定的说明符,如果有,就用它;没有,则不改变说明符(直接返回说明符)。
您将如何测试这个方法呢?一种办法是在网页中包含这个脚本,然后在需要的地方使用它,并且手工校验网站能否正确显示日期。如果它有问题,我们可能也得不到什么线索,只能跟踪调试。一种稍复杂一点的办法(其实也复杂不了多少)是在网页中加载它,然后打开控制台,在其中使用它。如清单1.3中所示的会话。
清单1.3 在Firebug中手工检查代码
~~~
>>>var date =new Date(2009,11,5);
>>>date.strftime("%Y");
"2009"
>>>date.strftime("%m");
"12"
>>>date.strftime("%d");
"05"
>>>date.strftime("%y");
"9"
~~~