2016-11-11 127 views
1

我试图麻烦我的代码,发现了一个奇怪的日期问题的js,我无法理解。 在Chrome的开发者工具,看这个表达式的值:对于javascript的奇怪日期问题

new Date(new Date() + (-1) * 60 * 1000).getTime() 

您将得到价值“男”。

如果关注此:

new Date(new Date() + (-1) * 60 * 100).getTime() 

您将得到价值 '1479095577000'。

为什么?

+2

你可能想使用'Date.now()'而不是'新的Date()'在那里。 'new Date()。toString()'返回一个字符串,然后当你执行'+(-1)'连接而不是添加。所以它会返回类似于“Fri Nov 11 2016 00:02:59 GMT-0800(Pacific Standard Time)-60000” – mash

+0

@mash,但为什么第二个代码有效? – KWeiss

+0

@KWeiss说实话不知道,由于某种原因,“周五2016年11月11日0时05分05秒格林尼治标准时间0800(太平洋标准时间)-1000”是一个有效的日期,但“周五2016年11月11日0时05分05秒GMT-0800(太平洋标准时间)-10000“不是。不确定后面的数字被解析为。 – mash

回答

1

Date对象能源部不会超载+,所以new Date() + n只是将两个操作数连接为字符串。

例如:

new Date() + (-1) * 60 * 1000 

相当于

String(new Date()) + String((-1) * 60 * 100) 

和产率(取决于环境)

Fri Nov 11 2016 09:05:43 GMT+0100-6000 

第二个例子产生因为 “-6000” 的外观的值就像一个时区修改器,即减去六十个小时,即使已经有一个。这是Chrome的解析怪癖 - Firefox将拒绝它,但Chrome将接受“-6000”,并在未来产生约60小时的日期。

只有附加字符串正好是四位数字(小时的前两位数字,分钟的两位数字),并且在其前面有一个+或一个 - 才有效。这就是为什么如果添加“-6000”而不是“-60000”,它会起作用。它不适用于正数,除非您手动添加“+”字符。

我怀疑你真正想要的是

Date.now() - 60 * 1000 
+0

任一表达式是否返回有效日期完全取决于实现。这两个表达式都不会在Safari中返回有效的日期。 – RobG

+0

是的,由于字符串不代表有效的日期,因此没有定义良好的浏览器行为。我检查了一些,似乎Chrome是独自接受语法。 –

2
  • new Date() + (-1) - 日期被转换为字符串,然后"-1"将连接到它,这是一个有效的日期,因为你减去一些时区偏移
  • new Date() + (-1) * 60 * 100 = new Date() + (-1 * 60 * 100) = new Date() + (-6000) - 这也是一个有效日期减去一定的时间区移
  • 但随后日期减去60000是不是有效的日期,由于时间区域仅具有4个数字顶部
+1

真棒回答。 我尝试找到边界值。 new Date('Fri Nov 11 2016 16:11:01 GMT + 0800(China Standard Time)-9999'); 没关系。 new Date('Fri Nov 11 2016 16:11:01 GMT + 0800(China Standard Time)-10000'); 但不是上述情况,它可以证明阿哈克的结论。 我也做了一些其他的尝试,得到了以下规则。 1.如果数字的结尾是一位数字或两位数字,则表示小时。 2.如果数字的结尾是三位数字或四位数字,最后2位数字表示分钟,前面的1或2位数字表示小时。 – Eason

0

正如其他人所说,这个问题是,第一+导致字符串连接而不是加法。可以修复,使用Date.now()或:

// Use unary + 
 
console.log(new Date(+new Date() + (-1) * 60 * 1000).getTime()); 
 

 
// Replacing `+` with `-` 
 
console.log(new Date(new Date() - 1 * 60 * 1000).getTime());

上面可以返回稍有不同的结果(±2毫秒左右)由于SO控制台的性能。

注意new Date(new Date() + (-1) * 60 * 1000).getTime())是否返回一个有效的日期或不完全取决于执行。 Safari会在OP中为这两个表达式返回无效日期。