提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

最近做的一个基于JavaScript的Word模板生成脚本时遇到的问题,比如时间格式1997.03.08,要将其转变为1997年3月8日,首先大家肯定能想到split(“.”),即根据点将源字符串分割到数组,然后依次提取相应的数组元素,但是03如何变成3呢,也就是说要去掉前导的0,其实我们可以通过转换为数字这个办法解决这个问题,如果是VBScript,那么就直接调用CInt,JavaScript我也想当然的调用了parseInt,就像下面这样:

var src_time = "1997.03.08";
var arr_time = src_time.split(".");
var year = parseInt(arr_time[0]); // 1997
var month = parseInt(arr_time[1]); // 3
var day = parseInt(arr_time[2]); // Uuh, 0?
alert(year + "年" + month + "月" + day + "日");

我们希望输出什么?1997年3月8日?错了,实际输出却是1997年3月0日,为什么是0日,到底做错了什么,我仔细翻阅了parseInt的用法:

parseInt 方法 返回由字符串转换得到的整数。 parseInt(numString, [radix] ) 参数 numString 必选项。要转换为数字的字符串。 radix 可选项。在 2 和 36 之间的表示 numString 所保存数字的进制的值。如果没有提供,则前缀为 '0x' 的字符串被当作十六进制,前缀为 ‘0’ 的字符串被当作八进制。所有其它字符串都被当作是十进制的。

其实这个函数有个可选项,也就是radix基数参数,默认省略的话,parseInt将自动判别numString的类型,这点与VBScript的CInt有所不同,parseInt功能相比要强大一些,那么问题就很清楚了,也就是说03和08都被当做是8进制处理了,这对8以内的数没有影响,但是对于包括8以及8以上的数,则错误的解释为0了。

这件事情告诫说明,不熟练使用的函数需要翻阅手册,仔细阅读说明后再使用,不能再想当然的使用,否则会有意想不到的后果。修正后的脚本如下(基数为10,表示十进制):

var src_time = "1997.03.08";
var arr_time = src_time.split(".");
var year = parseInt(arr_time[0], 10); // 1997
var month = parseInt(arr_time[1], 10); // 3
var day = parseInt(arr_time[2], 10); // 8
alert(year + "年" + month + "月" + day + "日");

再回到刚才那个问题,有没有更加方便的办法提取这个时间呢,当然是有的,比如说正则表达式,JS在正则方面支持还是比较好的。

var src_time = "1997.03.08";
var regstr = /^(\d{4})\.0?(\d{1,2})\.0?(\d{1,2})$/;
var arr_time = src_time.match(regstr);
var year = arr_time[1];
var month = arr_time[2];
var day = arr_time[3];
alert(year + "年" + month + "月" + day + "日");