【问题标题】:Two identical dates in different formats give different epoch times不同格式的两个相同日期给出不同的纪元时间
【发布时间】:2019-04-12 09:46:54
【问题描述】:

以下声明:

(new Date("1993-09-01")).getTime() == (new Date(1993,9,1)).getTime()  

似乎在 Node、Firefox 和 Chromium 上都评估为 false。为什么会这样?

【问题讨论】:

  • 您可以找到更多关于日期类型的信息here
  • 两个“相同”的日期相隔一个月。 new Date(1993, 9, 1) 是 1993 年 10 月 1 日。阅读 Date 的文档

标签: javascript date


【解决方案1】:

这是因为 JavaScript Date 对象中月份的索引从 0 开始(即一月为 0,二月为 1,以此类推)。

对于右侧的语句,如果我尝试使用 console.log( ) 它。

尝试运行以下代码 sn-p:

const date1 = new Date(1993,9,1);
const date2 = new Date('1993-09-01');

console.log(date1);
console.log(date2);

根据JavaScript Date object documentation,实例化日期对象有多种方式。关于您的问题,您已经使用了文档中提到的两种格式:

1) new Date(dateString) dateString 的一些可接受的格式包括“1995 年 12 月 17 日 03:24:00”、“1995-12-17T03:24:00”和“1993-09-01”。

2)new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);

请注意,对于第二个参数monthIndex,文档说明月份是从 0 开始的,这意味着我们必须从 0 开始计数。

注意:参数 monthIndex 是从 0 开始的。这意味着一月 = 0,十二月 = 11。

因此,new Date(1993, 9, 1) 表示 1993 年 10 月 1 日。您应该改用 new Date(1993, 8, 1)


即便如此,在进行上述更改后,下面的 sn-p 仍会打印为 false。为什么会这样?

console.log((new Date('1993-09-01')).getTime() === (new Date(1993,8,1)).getTime())  

再一次,我们在documentation 中引用此部分:

如果提供了至少两个参数,则缺少的参数是 设置为 1(如果缺少这一天)或为所有其他设置为 0。

这意味着在new Date(1993,8,1)的情况下,剩余的可选参数(小时、分钟、秒和毫秒)被设置为0。因此,new Date(1993,8,1)相当于写new Date(1993,8,1,0,0,0,0)

【讨论】:

  • 我认为 Javascript 会符合 ISO 8601 标准?
  • 这取决于您如何实例化日期对象。请允许我进一步详细说明我的答案。
  • 取决于您所在的时区。在内部,时间以 UTC 时间工作。创建对象时没有一种直接指定时区的方法,但您可以处理输出以获得正确的输出。
  • @EduardoGarcia 没错!也感谢分享
【解决方案2】:

两件事:

  • 对于long constructor,月份从 0 开始。所以new Date(1993, 9, 1) 不是 9 月,而是 1993 年 10 月 1 日当地时间
  • 对于one argument constructor,当字符串以yyyy-mm-dd 格式传递时,引擎可以假定时区是UTC 或本地,具体取决于规格跟随(ref)。因此,如果引擎遵循 ES5 规范,new Date("1993-09-01").getTime() == new Date(1993, 8, 1) 仍可能返回 false:

var d1 = new Date("1993-09-01");
var d2 = new Date(1993, 8, 1);
console.log(d1.toISOString());
console.log(d2.toISOString());

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 2017-09-22
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多