为什么当我用另一个Date对象构造一个JavaScript Date对象时,生成的Date对象的ms部分被剥离了?

时间:2014-05-13 04:31:58

标签: javascript firefox datetime

如果我运行这样一个简单的测试:

新日期(新日期(1050))。valueOf()

而不是获得1050,我得到1000.这发生在Firefox和Internet Explorer上。

Google Chrome和Opera正确返回1000。

3 个答案:

答案 0 :(得分:3)

内部日期可能会转换为字符串,然后由外部日期的构造函数解析。

请注意,在所有浏览器中:

new Date(new Date(1050).toString()).valueOf()

返回1000,而:

new Date(new Date(1050).valueOf()).valueOf()

返回1050。

toString的输出根本不包含任何毫秒信息。

也许其他人可以回答为什么某些浏览器在这些“隐式转换”中使用toString代替valueOf"场景。我的猜测是ECMAScript规范中的行为未定义 - 但我还没有检查过。

答案 1 :(得分:2)

马特有你的答案,但要在规范中追踪它:

  1. §15.9.3.2new Date(value)首先致电ToPrimitive(value)
  2. 可以使用数字或字符串提示调用
  3. ToPrimitive。如果未提供提示,则默认为数字以外的Date对象,其中提示默认为 string
  4. 所以 ToPrimitive 调用对象的 toString 方法,在本例中为Date.prototype.toString,返回表示日期的实现相关字符串。
  5. 然后由Date.parse解析此字符串,这也是非标准字符串的实现,它将字符串转换为日期对象。
  6. toString 解析步骤中,毫秒被删除。但是,我无法想象将时间值转换为字符串,然后返回到一个表达式中的时间值的原因。

    请注意,此解析意味着类似new Date('5/5/70')之类的内容将创建1970年5月5日的日期对象,即使需要70AD年份也是如此。因此,如果您使用new Date(dateObject)复制日期对象,最好让new Date(+dateObject)强制将日期强加给time value,而不是让ECMA-262使用它的方式和使用字符串值。虽然您不太可能需要复制0到99AD范围内的日期,但很高兴知道如果尝试它会正常工作。

答案 2 :(得分:0)

试试这个:

new Date(new Date(1050).getTime()).getTime()

这将在所有浏览器中获得与“1050”相同的结果。