我试图麻烦我的代码并发现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'。
为什么?
答案 0 :(得分:2)
rake db:seeds
- 将日期转换为字符串,然后将new Date() + (-1)
连接到它,这是一个有效的日期,因为您正在减去一些时区偏移量"-1"
= new Date() + (-1) * 60 * 100
= new Date() + (-1 * 60 * 100)
- 这也是一个有效日期减去一些时区转移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中的两个表达式返回无效日期。