为什么同一个日期有不同的小时数?

时间:2017-02-28 16:26:47

标签: javascript date

也许答案很明显,但我不明白。为什么代码段中的日期不同?格式是否也说明了小时数?

console.log("2017-1-9 -->")
console.log(new Date("2017-1-9"))
console.log("2017-1-09 -->")
console.log(new Date("2017-1-09"))
console.log("2017-01-9 -->")
console.log(new Date("2017-01-9"))
console.log("2017-01-09 -->")
console.log(new Date("2017-01-09"))
console.log("2017-01-11 -->")
console.log(new Date("2017-01-11"))
.as-console-wrapper { 
  min-height: 100%;
}

即使在我的chrome-console和code-snippet-console中,我也会得到不同的日期:

enter image description here

我的问题不是两个控制台都记录了不同的日期。只查看每个控制台中的hours,在同一天,只有datestring不同。因此我的问题是:

为什么日期不同?

更新

为什么new Date("2017-1-1").getTime() != new Date("2017-01-01").getTime() --> true

var date = new Date("2017-2-9");
var dateWithZero = new Date("2017-02-09");
console.log(date);
console.log(date.getTime());
console.log(dateWithZero);
console.log(dateWithZero.getTime());
console.log(date.getTime() == dateWithZero.getTime());
.as-console-wrapper {
  min-height: 100%;
}

3 个答案:

答案 0 :(得分:3)

显示的日期使用不同的时区。 Chrome控制台输出正在使用您的浏览器本地时区并进行适当调整。 (GMT + 0100)告诉您正在进行的时区和调整。代码段控制台使用UTC显示。 ' Z'在字符串的末尾表示。

如果您想让自己相信它们是相同的,请同时打印每个日期的时间戳。这也是为什么当你处理日期时,你应该依赖时间戳而不是像这样比较日期。事情变得非常混乱,难以处理。

答案 1 :(得分:2)

TL; DR:因为语言规范说不符合指定格式的日期字符串可以根据"任何特定于实现的启发式或特定于实现的日期格式进行解析,& #34;而YYYY-M-D就是这样一个字符串。

让我们深入了解规范。这是ECMAScript 5.1 spec关于Date构造函数的说法(我引用它而不是当前的ES2016规范只是因为它更简单,但后者works basically the same in this case) :

  

15.9.3.2 new Date (value)

     

...

     

新构造的[[PrimitiveValue]]内部属性   对象设置如下:

     
      
  1. v 为ToPrimitive( value )。
  2.   
  3. 如果Type( v )是String,那么

         
        
    • v 解析为日期,方式与 parse 方法(15.9.4.2)完全相同;让 V 为此日期的时间值。
    •   
  4.   
  5. ...

  6.   

这里是parse(强调我的)的规范:

  

15.9.4.2 Date.parse (string)

     

parse函数将ToString运算符应用于其参数,并将结果String解释为日期和时间......函数首先尝试根据日期时间字符串格式中调出的规则解析String的格式({ {3}})。 如果字符串不符合该格式,则该函数可能会回退到任何特定于实现的启发式或特定于实现的日期格式。 ...

简而言之,

15.9.1.15YYYY-MM-DDTHH:mm:ss.sssZ及其子集。由于YYYY-M-D不符合该格式,因此(不幸的是)解释器可以自由地做任何想做的事情。如果您想知道Chrome为何以这种特殊方式执行此操作,您必须Date Time String Format

答案 2 :(得分:1)

在某些浏览器中,没有前导零的月或日可能会产生错误:

new Date("2017-2-9");

有条理地说,格式“yyyy-mm-dd”的行为未定义。

有些浏览器会尝试猜测格式,有些会返回NaN,有些会返回null。

这就是new Date("2017-02-09")输出Thu Feb 09 2017 01:00:00 GMT+0100 (Mitteleuropäische Zeit)的原因,因为定义了此格式的行为,并将时区添加到日期。 new Date("2017-2-9")输出Thu Feb 09 2017 00:00:00 GMT+0100 (Mitteleuropäische Zeit),因为chrome试图猜测格式,但无法添加时区。在Safari中返回null