繁体   English   中英

为什么在年末字符串末尾添加空格字符会导致JavaScript(节点)应用时区偏移量?

[英]Why does adding a space character at the end of a year string cause JavaScript (node) to apply the timezone offset?

具体来说,这是在Node v8.9.0中。

考虑以下几点:

console.log(new Date("2006"));
console.log(new Date("2006 "));

他们产生这个输出:

2006-01-01T00:00:00.000Z
2006-01-01T08:00:00.000Z

请注意,第二行具有8小时的时区偏移。

为什么存在或不存在尾随空格会导致创建日期时是否有时区偏移?

简介:空间的存在导致日期解析器将日期解释为不同的格式,当字符串中没有时区规范时,该格式对时区使用不同的假设。

Date()构造函数或Date.parse()的复杂性是,对于不完整或部分日期字符串,解析器试图猜测该字符串是否应被解释为ISO 8601格式RFC2822格式的简化形式。 如果它认为格式为ISO 8601且未指定时区,则将假定UTC时区。 如果它认为格式是RFC2822,那么将假定本地计算机时区。

因此,对于您的两个字符串,第一个显然被假定为ISO 8601,因此使用UTC时区假设,第二个显然被假定为使用本地时区的RFC2822。

支持的ISO 8601格式不包含空格,而RFC2822格式可以包含一些空格,因此字符串中空间的存在似乎可能导致解析器选择使用本地时区的RFC2822格式。

您可以在MDN上的Date.parse() doc中阅读其中的一些内容。

这里参考的是一个简化的ISO 8601格式:

   Year:
      YYYY (eg 1997)
   Year and month:
      YYYY-MM (eg 1997-07)
   Complete date:
      YYYY-MM-DD (eg 1997-07-16)
   Complete date plus hours and minutes:
      YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
   Complete date plus hours, minutes and seconds:
      YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
   Complete date plus hours, minutes, seconds and a decimal fraction of a
second
      YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)
where:

     YYYY = four-digit year
     MM   = two-digit month (01=January, etc.)
     DD   = two-digit day of month (01 through 31)
     hh   = two digits of hour (00 through 23) (am/pm NOT allowed)
     mm   = two digits of minute (00 through 59)
     ss   = two digits of second (00 through 59)
     s    = one or more digits representing a decimal fraction of a second
     TZD  = time zone designator (Z or +hh:mm or -hh:mm)
     T    = a literal T separating the time

您可以看到此格式中没有空格。


RFC2822格式包含空格,分隔日期/时间的不同部分。 完整的语法在链接的RFC中,但是这里有一个例子,你可以看到空格:

Mon, 25 Dec 1995 13:30:00 GMT

请注意, Date.parse()ES2015规范描述了简化的ISO 8601日期格式 当您提供任何与该格式不完全匹配的字符串时,您可能会遇到一些依赖于实现的解析行为。 引自ES2015规范:

当给定任何不符合日期时间字符串格式的字符串值时,Date.parse生成的值与实现有关( 20.3.1.16

引用“日期时间字符串格式”的地方是简化的ISO 8601格式。

暂无
暂无

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

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