3

我正在尝试制作一个应该检查某个日期是否格式正确的函数。为此,该函数接受一个变量,并将其分解为三个子变量,年、月和日。稍后我想在几个 if 语句中检查每个子字符串。

当我使用我的 GFs 编号(即 880413,然后 year=88,month=4,day=13)运行此函数时,当我使用我自己的编号(820922)运行此函数时,该函数将年份设置为 82,月份设置为 0? !和天= 22。

这怎么可能?当月份为 04 时,它会将其截断并仅显示 4,但当月份为 09 时,它将其截断为 0。

继承人相关代码:

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 位数字) 在此处输入图像描述

4

5 回答 5

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));
于 2012-09-10T20:15:02.247 回答
3

指定基数 - 使用 parseInt("09", 10)。由于遗留原因,以零开头的数字将被解析为八进制。“8”和“9”不是有效的八进制数字,因此“09”无法成功解析为整数。

编辑 - 做一些挖掘,显然你所做的确实符合官方的 ECMAscript 标准,但大多数实现无论如何都使用八进制格式 - 详细信息在这里

于 2012-09-10T20:16:38.557 回答
1

在08的情况下,您也会看到同样的问题。这是因为 Javascript 将 0 开头的数字视为八进制,而八进制中没有09or 08。因此,您可以提供基础作为第二个参数:

alert(parseInt('08',10));
于 2012-09-10T20:19:56.897 回答
0

当您将字符串与整数连接时,它永远不会给您 04。要获得您想要的结果,您需要使用 printf:

'%02d--%02d--%02d'.sprintf(year, month, day);

函数 sprintf 来自原型库。

于 2012-09-10T20:19:59.613 回答
0

正则表达式可能会有所帮助。

date.replace( /(\d{2})(\d{2})(\d{2})/,'$1--$2--$3--');  
于 2012-09-10T20:27:35.507 回答