近段时间对javascript的日期处理非常不满意,以前使用.net习惯了,日期处理有很多很多的方法,但javascript对日期的处理就非常弱了,不过幸好,javascript的可扩展性非常强,我们可以写函数来扩展它,关于javascript日期的扩展,可以参考笔者写的相关文章:
闲话少说,咱们来点实在的,先说需求:
- 将字符串转换为日期格式
- 不需要日期格式化的表达式
- 支持中文
- 不要求顺序,如可以将2009年10y8月转换为2009-10-8的日期格式,也可以将9时2009年10日5月转换为2009-5-10 9:00:00
- 直接从String扩展
好像有点难度哈,难度主在于中文单位和乱序及不要表达式,怎么办?还是采用正则表达式吧,这个东东是个好东东,强烈推荐。说过题外话,上次GF写毕业论文的时候,有一个调查需要替换,她的调查格式是这样的,A 你叫什么名字 B 你吃饭没有。需要在AB后面加上一点,变成A. 你叫什么名字 B. 你吃饭没有。正在GF咬牙狠狠地一个一个改的时候,某人(当然是我的)飞身而至,轻敲键盘,输入一个正则表达式,将([A-D])\s替换为\1 ,GF赏香吻一个,呵呵。
撇开题外话,正则还是很有用的,很多软件都正则有支持,不管你是不是编程,学会正则,会让你的工作效率有大大的提高。代码其实比较简单点,我就不解释了,代码中注释写得比较多,也没有解释的必要了,我说下思路吧。
- 合法的日期应该是一个数字带一个单位的,如在这个日期中,2008年10M8d,我们把这个字符分开,变成2008年,10M,8d。这时个我们就只需要取出数字与单位即可。
- 我们知道,在javascript中,我们访问一个对象的属性值可以使用object[prototype]或者object.prototype的方式来读取,当没有这个属性的时候,取出的值就是undefined。ok,我们可以利用这个特性来判断单位是否为英文。
- 我们使用正则表达式将数字后面带单位的字符取出来,然后循环将数字赋值给对应相应的属性,最后我们将对象组合为日期即可
有点晕乎吧,还是看代码来得实际滴,呵。
//字符串转为日期,但不需要表达式 String.prototype.toDateEx = function() { var data = { y: 0, M: 0, d: 0, h: 0, m: 0, s: 0, ms: 0 }; //中文单位与英文单位对应 var cn = { "年": "y", "月": "M", "日": "d", "时": "h", "分": "m", "秒": "s", "毫秒": "ms" }; //第一步,取出数字与单位,如10月,2009年 var result = this.match(/\d+((ms)|[yMdhms年月日时分秒]|(毫秒))/ig); //第二步,循环取出数字,再根据单位把数据赋值到data中 for (var i = 0; i < result.length; i++) { RegExp(/(\d+)([yMdhms年月日时分秒]|(毫秒))/).test(result[i]); //例:2009年这个时间中,RegExp.$2应该是年,而data[年]是取不到合法的值的, //所以值为undefined,这样我们就可以判断是中文的值 if (data[RegExp.$2] == undefined) { data[cn[RegExp.$2]] = RegExp.$1; } else { data[RegExp.$2] = RegExp.$1; } } return new Date(data.y, data.M - 1, data.d, data.h, data.m, data.s, data.ms); } document.writeln("<pre>"); document.writeln("测试结果"); document.writeln("2009年10月15日".toDateEx()); document.writeln("2009y10M15d".toDateEx()); document.writeln("10秒5分4时2008年3d9M".toDateEx()); document.writeln("< /pre>");
注意:本文为我的独立博客镜像博客,自发表不再更新,原文可能随时被更新,敬请访问原文。同时,请大家不要在此评论,如果有什么看法,请点击这里:http://iove.net/1705/
本文来自http://iove.net,欢迎转载,转载敬请保留相关链接,否则视为侵权,原文链接:http://iove.net/1705/
浙公网安备 33010602011771号