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

JS直接转换含中文的乱序字符为日期

2009-10-14 15:37 204 查看
近段时间对javascript的日期处理非常不满意,以前使用.net习惯了,日期处理有很多很多的方法,但javascript对日期的处理就非常弱了,不过幸好,javascript的可扩展性非常强,我们可以写函数来扩展它,关于javascript日期的扩展,可以参考笔者写的相关文章:

Javascript日期处理中正则的应用

javascript中根据表达式实现字符串格式化为日期——升级版

javascript中实现读取指定格式的日期(format)

闲话少说,咱们来点实在的,先说需求:

将字符串转换为日期格式

不需要日期格式化的表达式

支持中文

不要求顺序,如可以将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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: