今天和网友聊起在javascript里面实现DateFormat 的话题。

把想法发布一下,当是笔记。

格式化:
1、先用正则把日期表达式分段:
var tokens = "yyyy-MM-dd(没有时间)".match(/y+|M+|d+|m+|[^yMdm]+/g)
//结果数组为:yyyy,-,MM,-,dd,(没有时间)
2、将其中的yyyy MM dd 替换成相映的处理对象

3、格式化时,先复制数组,依次遍历,如果元素是处理对象,那么元素值替换成处理结果。

4、将新数组join。即为需要结果。

5、parse时。先复制数组,若元素为字符串,精确匹配。若未处理对象,读取需要的值,匹配失败,则终止操作,返回结果。





yyyy MM dd 的处理对象可以根据首字母确定,长度可以作为处理函数的参数,这样,减少对象数目。维护起来方便一点。

想法而已,实际实现时可能还有很多现在无法意料的事情:)
评论
hax 2007-06-08
campaign 写道
请问if(/(y+)/.test(fmt)) 这句是什么意思


正则。

如果fmt里有一个“y”
campaign 2007-06-08
请问if(/(y+)/.test(fmt)) 这句是什么意思
jindw 2007-06-08
如果按照上面的想法,实现出来,分隔符时不需要定义的,只要不是yMdhms都将当作分隔符处理,基本喝java 的 DateFormat行为一样了:)
jianfeng008cn 2007-06-08
ext的也很不错 不过好像这些都不支持 分隔符 自定义 比如可以用“-” 也可以用“/”
hax 2007-06-07
理想上最好是实现java的DateFormat。
不过要求不是很高的话,Meizz的用用就可以了。
aiut 2007-06-07
("00"+ o[k]).substr((""+ o[k]).length);

这句比较经典
myy 2007-06-07
这个很不错,好像是 csdn 的 Meizz 写的:

// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
Date.prototype.Format = function(fmt)
{ //author: meizz
var o = {
"M+" : this.getMonth()+1, //月份
"d+" : this.getDate(), //日
"h+" : this.getHours(), //小时
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt))
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
for(var k in o)
if(new RegExp("("+ k +")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
return fmt;
}
jindw
  • 浏览: 203644 次
  • 性别: Icon_minigender_1
  • 来自: 初到北京
  • 详细资料
搜索本博客
存档
最新评论