javascript的奇怪日期问题

时间:2016-11-11 07:59:42

标签: javascript date

我试图麻烦我的代码并发现js的奇怪日期问题,我无法理解。 在chrome的开发人员工具上,请观察此表达式的值:

ax = s.hist()
for rect in ax.patches:
    height = rect.get_height()
    ax.text(rect.get_x() + rect.get_width()/2., 1.01*height+100,
            '%d' % int(height),
            ha='center', va='bottom', rotation=90)

你将获得价值' NaN'。

如果看这个:

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

你将获得价值' 1479095577000'。

为什么?

3 个答案:

答案 0 :(得分:2)

  • rake db:seeds - 将日期转换为字符串,然后将new Date() + (-1)连接到它,这是一个有效的日期,因为您正在减去一些时区偏移量
  • "-1" = new Date() + (-1) * 60 * 100 = new Date() + (-1 * 60 * 100) - 这也是一个有效日期减去一些时区转移
  • 但由于时区只有4位数字,因此日期减去new Date() + (-6000)不是有效日期

答案 1 :(得分: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"看起来像一个时区修饰符,减去60个小时,即使已经有一个。这是Chrome的解析怪癖 - Firefox会拒绝它,但Chrome会接受" -6000"并且将来会产生60个小时的日期。

仅当附加的字符串恰好是四位数字(小时的前两位数字,分钟的两位数字),并且前面有一个+或一个 - 时才有效。这就是为什么它可以添加" -6000"但不是" -60000"。除非你添加" +"否则它也不会使用正数。手动填写字符。

我怀疑你真正想要的是

Date.now() - 60 * 1000

答案 2 :(得分:0)

正如其他人所说,问题是第一个number导致字符串连接而不是添加。您可以使用+或:

来解决此问题

Date.now()

由于SO控制台的性能,上述结果可能会略有不同(±2ms左右)。

请注意,// Use unary + console.log(new Date(+new Date() + (-1) * 60 * 1000).getTime()); // Replacing `+` with `-` console.log(new Date(new Date() - 1 * 60 * 1000).getTime());是否返回有效日期完全取决于实现。 Safari为OP中的两个表达式返回无效日期。