new Date() 为时区返回不同的值,具有不同的输入
new Date() returning different values for time zones, with different inputs
var date1 = "2015-03-29";
console.log(new Date(date1)); //Output:Sun Mar 29 2015 05:30:00 GMT+0530 (India Standard Time)
var date2 = "1869-12-31";
console.log(new Date(date2)); //Output:Fri Dec 31 1869 05:53:20 GMT+0553 (India Standard Time)
var date3 = "1870-01-01";
console.log(new Date(date3)); //Output:Sat Jan 01 1870 05:21:10 GMT+0521 (India Standard Time)
在调试一些 Date() 相关问题时,看到 Date() 在不同输入下的上述行为。
尽管我的系统时区是 GMT +05:30
,但所有三个输入的时区都不同
这是预期的吗?
提前感谢您的帮助!
您显示的值是正确的。
ECMAScript 要求将 YYYY-MM-DD
格式的 date-only 值视为 UTC。来自 the spec:
... When the UTC offset representation is absent, date-only forms are interpreted as a UTC time and date-time forms are interpreted as a local time.
然后 toString
函数转换为本地时间的字符串表示形式,其中考虑了系统时区。
印度的 IANA 时区数据,包括丰富的文档注释,can be found here。数据本身如下(截至tzdata 2021a版本):
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Kolkata 5:53:28 - LMT 1854 Jun 28 # Kolkata
5:53:20 - HMT 1870 # Howrah Mean Time?
5:21:10 - MMT 1906 Jan 1 # Madras local time
5:30 - IST 1941 Oct
5:30 1:00 +0630 1942 May 15
5:30 - IST 1942 Sep
5:30 1:00 +0630 1945 Oct 15
5:30 - IST
您可以在第二行和第三行数据中看到示例中两个较早的偏移量。如果您选择更早的日期(1854-06-28 之前),您将获得与第一行的偏移量。您还可以看到印度在两个不同的历史时期使用了 +06:30 偏移量。
还可以以更 human-readable 的形式获得所有历史记录
这就是时区的工作原理。它们不固定为单个数字偏移量,而是一个偏移量适用于特定时间点的时区,并且该偏移量可以随控制该时区的政府的心血来潮而改变。有关更多信息,请阅读 the timezone tag wiki.
中标题为“时区!= 偏移量”的部分
var date1 = "2015-03-29";
console.log(new Date(date1)); //Output:Sun Mar 29 2015 05:30:00 GMT+0530 (India Standard Time)
var date2 = "1869-12-31";
console.log(new Date(date2)); //Output:Fri Dec 31 1869 05:53:20 GMT+0553 (India Standard Time)
var date3 = "1870-01-01";
console.log(new Date(date3)); //Output:Sat Jan 01 1870 05:21:10 GMT+0521 (India Standard Time)
在调试一些 Date() 相关问题时,看到 Date() 在不同输入下的上述行为。
尽管我的系统时区是 GMT +05:30
,但所有三个输入的时区都不同这是预期的吗?
提前感谢您的帮助!
您显示的值是正确的。
ECMAScript 要求将 YYYY-MM-DD
格式的 date-only 值视为 UTC。来自 the spec:
... When the UTC offset representation is absent, date-only forms are interpreted as a UTC time and date-time forms are interpreted as a local time.
然后 toString
函数转换为本地时间的字符串表示形式,其中考虑了系统时区。
印度的 IANA 时区数据,包括丰富的文档注释,can be found here。数据本身如下(截至tzdata 2021a版本):
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Kolkata 5:53:28 - LMT 1854 Jun 28 # Kolkata
5:53:20 - HMT 1870 # Howrah Mean Time?
5:21:10 - MMT 1906 Jan 1 # Madras local time
5:30 - IST 1941 Oct
5:30 1:00 +0630 1942 May 15
5:30 - IST 1942 Sep
5:30 1:00 +0630 1945 Oct 15
5:30 - IST
您可以在第二行和第三行数据中看到示例中两个较早的偏移量。如果您选择更早的日期(1854-06-28 之前),您将获得与第一行的偏移量。您还可以看到印度在两个不同的历史时期使用了 +06:30 偏移量。
还可以以更 human-readable 的形式获得所有历史记录这就是时区的工作原理。它们不固定为单个数字偏移量,而是一个偏移量适用于特定时间点的时区,并且该偏移量可以随控制该时区的政府的心血来潮而改变。有关更多信息,请阅读 the timezone tag wiki.
中标题为“时区!= 偏移量”的部分