JavaScript错误地将毫秒转换为日期?

时间:2012-10-05 17:00:40

标签: javascript date

我注意到我正在处理的一些数据存在问题(2000多行数据)。

问题很奇怪:代码工作正常!当JavaScript无法生成正确的日期时, UNTIL 达到了特定日期(在本例中为01/08/2011)?

所以,解释一下:我正在采用'dd / mm / yyyy'格式的字符串并且正在执行(这不起作用):

  • var date = '01/08/2011'.split('/');
  • var milliseconds = new Date(date[2], parseInt(date[1]) - 1, date[0]).getTime(); => 1291161600000
  • new Date(1291161600000); => 2010年12月1日星期三00:00:00 GMT + 0000(GMT)

...但是,确切的代码在2011年8月1日之前的任何日期都能正常运作吗?

请再次使用29/07/2011 ...

  • var date = '29/07/2011'.split('/');
  • var milliseconds = new Date(date[2], parseInt(date[1]) - 1, date[0]).getTime(); => 13118.94亿
  • new Date(1311894000000); => 2011年7月29日星期五00:00:00 GMT + 0100(BST)

唯一的区别是返回的(GMT)和(BST)值,这表明了区域设置问题。但是为什么会发生这种情况,我如何修复代码来解决这个问题呢?

非常感谢你能给我的任何帮助。

1 个答案:

答案 0 :(得分:4)

你正在做八进制!

使用基数!

parseInt(date[1],10)

来自MDN Docs parseInt(string[, radix])

  

如果radix未定义或为0,则JavaScript假定以下内容:

     
      
  • 如果输入字符串以“0x”或“0X”开头,则基数为16(十六进制)。
  •   
  • 如果输入字符串以“0”开头,则基数为8(八进制)。此功能是非标准的,有些实现故意不这样做   支持它(而不是使用基数10)。因此总是如此   使用parseInt时指定基数。
  •   
  • 如果输入字符串以任何其他值开头,则基数为10(十进制)。
  •