我正在尝试创建一个函数,它应该检查某个日期是否格式正确。 对此,函数接受一个变量,并将其分解为三个子变量,年,月和日。稍后我想在几个if语句中检查每个子串。
当我使用我的GFs号码880413然后年份= 88,月份= 4,天= 13运行时 但是,当我用我自己的号码820922运行这个函数时,那么函数将year设置为82,month设置为0 ?!和白天= 22。
这怎么可能?当月份为04时,它会将其切断并仅显示4,但是当月份为09时,它会将其切断为0。
Heres相关代码:
function isValidDate(date)
{
var valid = true;
var year = parseInt(date.substring(0, 2));
var month = parseInt(date.substring(2, 4)); // error here!
var day = parseInt(date.substring(4, 6));
alert(year+"--"+month+"--"+day+"--")
}
运行号码820922时的输出(忘记最后4位数字,它们是瑞典社会安全号码,在此示例中无需考虑)
并且输出号为880413(再次忘记最后4位数)
答案 0 :(得分:7)
使用parseInt()
时始终指定基数原因是如果你没有指定它,它不会默认为基数10,而是根据第一个数字/字符猜测。 IE如果以'0'开头则将其解释为八进制
function isValidDate(date)
{
var valid = true;
var year = parseInt(date.substring(0, 2), 10);
var month = parseInt(date.substring(2, 4), 10);
var day = parseInt(date.substring(4, 6), 10);
alert(year+"--"+month+"--"+day+"--")
}
或使用Number()
即
var month = Number(date.substring(2, 4));
答案 1 :(得分:3)
指定base - 使用parseInt(“09”,10)。由于遗留原因,启动一个零的数字将被解析为八进制。 “8”和“9”不是有效的八进制数字,因此“09”无法成功解析为整数。
编辑 - 进行一些挖掘,显然你所做的事情符合官方ECMAscript标准,但大多数实现仍然使用八进制格式 - 详情here。
答案 2 :(得分:1)
如果 08 ,您也会看到相同的问题。这是因为Javascript将以0开头的数字视为八进制,并且八进制中没有09
或08
。所以你可以提供基数作为第二个参数:
alert(parseInt('08',10));
答案 3 :(得分:0)
当你用一个整数连接字符串时,它永远不会给你04.要获得你想要的结果,你需要使用printf:
'%02d--%02d--%02d'.sprintf(year, month, day);
函数sprintf来自Prototype库。
答案 4 :(得分:0)
正则表达式可能有所帮助。
date.replace( /(\d{2})(\d{2})(\d{2})/,'$1--$2--$3--');