【问题标题】:Javascript Date "Invalid Date" in IE when copying very old dates复制非常旧的日期时,IE 中的 Javascript 日期“无效日期”
【发布时间】:2013-04-17 22:37:10
【问题描述】:

代码:

var x = new Date(Date.UTC(0, 0, 0));
x.setUTCFullYear(0);

// in Firefox, writes "Date {Sat Dec 30 0000 16:00:00 GMT-0800 (Pacific Standard Time)}"
// in IE, writes "LOG: Sat Dec 30 16:00:00 PST 1 B.C."
console.log(x);  

// Create a copy of x
var y = new Date(x);

// in Firefox, writes "Date {Sat Dec 30 0000 16:00:00 GMT-0800 (Pacific Standard Time)}"
// in IE, writes "LOG: Invalid Date"

console.log(y);

这似乎发生在任何非常古老的日期

我的问题:这里到底什么是无效的,为什么只有 IE?我怎样才能解决这个问题并实际创建日期的副本?

【问题讨论】:

  • var y = new Date(x.getTime()); 呢?
  • 什么版本的 IE,它是只在兼容模式下发生还是总是发生?
  • @Ejay——你的意思是?
  • 最好以ECMA-262开头。 Javascript 日期对象被定义为使用公历系统,从引入时向前和向后扩展。天文系统在这里不适用。

标签: javascript date


【解决方案1】:

似乎当一个日期对象被传递给 IE 中的 Date 构造函数时,它被评估为时间值以外的东西(可能调用toString)。

要强制它评估时间值,您可以这样做:

new Date(x.getTime());

new Date(+x);

或任何使日期返回其时间值而不是字符串的表达式。

当将单个值传递给Date constructor 时,它会转换为原始值。规范没有说明是否应该将其转换为字符串或数字。所以 IE 并不是不合规的,它只是行为不同而已。

虽然在这种情况下 IE 似乎没有正确解析它自己的日期字符串表示,但这是不寻常的。 70-01-01 之前的任何日期似乎都失败了,这可能没有实际意义,因为公历是在 1582 年才引入的。时间值本身可以涵盖从公元前 283458 年到公元 287396 年的日期。

无论如何,修复很简单。

编辑 2016

ES5 中,将日期传递给名为Date.prototype.toString 的日期构造函数,因此构造函数必须解析它自己的日期字符串版本。 ECMAScript 2015 已修复此问题,因此直接使用时间值。

然而,并不是所有的浏览器都支持 ECMAScript 2015,所以即使 new Date(date) 返回错误值的可能性很小并且一天比一天小,使用 +date 仍然更安全(直到 IE 8 完全消失) .

【讨论】:

  • RobG 说得好。感谢您的洞察力!
猜你喜欢
  • 2019-02-11
  • 2020-03-10
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2010-11-24
相关资源
最近更新 更多