有这么一个JavaScript函数,目的是想判断两个形式为“YYYY-MM-DD hh:mm:ss”或“YYYY/MM/DD hh:mm:ss”的字符串表示的日期的先后顺序,代码如下:
这个函数看上去好像没错,但实际运行的时候就会出现很诡异的情况:用"2009-03-05 12:00:00"和"2009-03-07 12:00:00"作为参数,运行结果为true;但是用"2009-03-07 12:00:00"和"2009-03-09 12:00:00"作为参数,运行结果为false。
问题就出在parseInt()函数上:
[quote]
[b]parseInt 方法[/b]
返回由字符串转换得到的整数。
parseInt([i]numString[/i], [[i]radix[/i]])
[b]参数[/b]
[i]numString[/i]
必选项。要转换为数字的字符串。
[i]radix[/i]
可选项。在 2 和 36 之间的表示 numString 所保存数字的进制的值。如果没有提供,则前缀为 '0x' 的字符串被当作十六进制,前缀为 '0' 的字符串被当作八进制。所有其它字符串都被当作是十进制的。
[b]说明[/b]
parseInt 方法返回与保存在[i]numString[/i]中的数字值相等的整数。如果[i]numString[/i]的前缀不能解释为整数,则返回NaN(而不是数字)。
parseInt("abc") // 返回 NaN。
parseInt("12abc") // 返回 12。
可以用isNaN方法检测NaN。
[/quote]
因此,parseInt("08")和parseInt("09")的结果都为0,才导致了上面的那个错误。对于0开头的10进制数,正确的方法应该是parseInt([i]numString[/i], 10)。
function dateToSecond(date) {
var regex = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/;
var result = date.match(regex);
return parseInt(result[1]) * 12 * 30 * 24 * 60 * 60
+ parseInt(result[3]) * 30 * 24 * 60 * 60 + parseInt(result[4]) * 24 * 60 * 60
+ parseInt(result[5]) * 60 * 60 + parseInt(result[6]) * 60
+ parseInt(result[7]);
}
function isBefore(start, end) {
return dateToSecond(start) < dateToSecond(end);
}
这个函数看上去好像没错,但实际运行的时候就会出现很诡异的情况:用"2009-03-05 12:00:00"和"2009-03-07 12:00:00"作为参数,运行结果为true;但是用"2009-03-07 12:00:00"和"2009-03-09 12:00:00"作为参数,运行结果为false。
问题就出在parseInt()函数上:
[quote]
[b]parseInt 方法[/b]
返回由字符串转换得到的整数。
parseInt([i]numString[/i], [[i]radix[/i]])
[b]参数[/b]
[i]numString[/i]
必选项。要转换为数字的字符串。
[i]radix[/i]
可选项。在 2 和 36 之间的表示 numString 所保存数字的进制的值。如果没有提供,则前缀为 '0x' 的字符串被当作十六进制,前缀为 '0' 的字符串被当作八进制。所有其它字符串都被当作是十进制的。
[b]说明[/b]
parseInt 方法返回与保存在[i]numString[/i]中的数字值相等的整数。如果[i]numString[/i]的前缀不能解释为整数,则返回NaN(而不是数字)。
parseInt("abc") // 返回 NaN。
parseInt("12abc") // 返回 12。
可以用isNaN方法检测NaN。
[/quote]
因此,parseInt("08")和parseInt("09")的结果都为0,才导致了上面的那个错误。对于0开头的10进制数,正确的方法应该是parseInt([i]numString[/i], 10)。