为什么在一年结束时添加空格字符会导致JavaScript(节点)应用时区偏移量?
这是特别在Node v8.9.0中。为什么在一年结束时添加空格字符会导致JavaScript(节点)应用时区偏移量?
考虑这些行:
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 format或RFC2822 format的简化形式。如果它认为格式是ISO 8601并且没有指定时区,则将假定UTC时区。如果它认为格式是RFC2822,则假定本地计算机时区。
因此,对于您的两个字符串,第一个显然被认为是ISO 8601,因此使用UTC时区假设,第二个显然被假定为使用本地时区的RFC2822。
支持的ISO 8601格式不包含空格,而RFC2822格式可以包含一些空格,因此看起来像是字符串中空间的存在可能导致解析器选择使用本地时间的RFC2822格式区。
你可以阅读关于in the Date.parse()
doc on MDN的一些。
仅供参考这里是一块简化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 format包含空格分隔日期/时间的不同部分。完整的语法是链接的RFC,但这里有一个例子,你可以看到空间:
Mon, 25 Dec 1995 13:30:00 GMT
注意,ES2015 spec for Date.parse()
描述simplified ISO 8601 date format。当您提供的任何字符串与该格式完全不匹配时,您可能会遇到一些依赖于实现的解析行为。从ES2015规格引用:
Date生成的值。当考虑到不符合日期时间字符串格式 (20.3.1.16)
其中所引用的“日期时间字符串格式”是简化的ISO 8601格式的字符串值 分析是实现相关的。
你看过[Date()'构造函数接受什么细节了吗(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse)为传入的格式字符串?由于解析器必须设法弄清楚你传递的是什么,显然它会有一个不同的假设,如果你有这个空间,它有不同的处理时区的方式。这篇文章讨论了什么时区。 – jfriend00