繁体   English   中英

为什么当我用另一个Date对象构造一个JavaScript Date对象时,得到的Date对象却剥去了ms部分?

[英]Why is it that when I construct a JavaScript Date object with another Date object, the resulting Date object has the ms parts stripped?

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

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

而不是1050,而是1000。这是在Firefox和Internet Explorer上发生的。

Google Chrome和Opera正确返回1000。

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

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

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

返回1000,而:

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

返回1050。

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

也许其他人可以回答为什么某些浏览器在这种“隐式转换”方案中使用toString而不是valueOf 我的猜测是该行为在ECMAScript规范中未定义-但我尚未检查。

马特(Matt)有您的答案,但可以在规范中进行追踪:

  1. §15.9.3.2表示要首先调用ToPrimitive(value) new Date(value) ToPrimitive(value)
  2. 可以使用数字或字符串提示来调用ToPrimitive 如果未提供任何提示,则默认值为number(日期对象除外) ,日期对象的提示默认为string
  3. 因此, ToPrimitive调用对象的toString方法,在本例中为Date.prototype.toString ,该方法返回表示日期的依赖于实现的字符串。
  4. 然后,该字符串由Date.parse解析,它也取决于非标准字符串的实现,它将非标准字符串转换为日期对象。

toStringparse步骤中,毫秒将被丢弃。 但是我无法想象将一个时间值转换为字符串,然后在一个表达式中转换回时间值的原因。

请注意,此解析意味着即使需要new Date('5/5/70') ,诸如new Date('5/5/70')也会为1970年5月5日创建日期对象。 因此,如果要使用new Date(dateObject)复制日期对象,则最好执行new Date(+dateObject)将日期强制为其时间值,而不是让ECMA-262拥有其使用方式并使用字符串值。 尽管您极不可能需要复制0到99AD范围内的日期,但是很高兴知道如果尝试,它将可以正常工作。

尝试这个:

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

在所有浏览器中,结果都将为“ 1050”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM