[英]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.