我设置了一个UTC+0时间,并希望它在每台计算机的本地时区的不同计算机中显示。但是当我在我的计算机(VMware VM)中运行Chrome中的代码时,它给了我以下信息:
Date.UTC(2014, 0, 27, 6) // 1390802400000
var now = new Date() // Tue Aug 05 2014 07:32:38 GMT-0400 (EDT)
now.getTime() // 1407238358829
new Date(1407238358829) // Tue Aug 05 2014 07:32:38 GMT-0400 (EDT)
new Date(1390802400000) // Mon Jan 27 2014 01:00:00 GMT-0500 (EST)
我的电脑使用的是GMT-4,为什么最后一行显示的是EST时间而不是EDT时间?
我也在其他计算机上尝试相同的代码,例如EC2实例(GMT+0)和我朋友的(GMT+8),这些计算机将只显示其本地时区的时间。
但是为什么我的电脑显示其他时区的时间?
代码运行正常。这就是时区的实际运作方式。希望一些合适的术语可以为你澄清困惑。
"时区偏移量"是而不是与"时区"相同。您可以在时区标签wiki.
中的"Time zone != offset"一节中了解更多信息。你说:
我的电脑是在GMT-4
这是不正确的。您的计算机位于北美"东部时间"时区。在Linux/Mac上,这可能显示为"America/New_York"
。在windows上,它会在你的控制面板上显示为"东部时间(美国)"。加拿大)"。
该时区的时区偏移量在冬季月份为UTC-05:00,在夏令时生效的夏季月份为UTC-04:00。我们分别称之为"东部标准时间"(EST)和"东部夏令时"(EDT)。虽然有时这些被称为"时区",但您可能希望将它们视为"时区段"——因为它们仅指实际时区的部分。
回顾一下:
EST = Eastern Standard Time = UTC-05:00 = GMT-5
EDT = Eastern Daylight Time = UTC-04:00 = GMT-4
ET = Eastern Time = "America/New_York" = "Eastern Time (US & Canada)"
- Uses EST in the winter
- Uses EDT in the summer
new Date(1390802400000)
显示为EST,因为该值在一月份,而一月份是冬季。
你还说:
我也在其他计算机上尝试相同的代码,例如EC2实例(GMT+0)和我朋友的(GMT+8),这些计算机将只显示其本地时区的时间。
EC2实例可能是为UTC配置的。这是服务器的最佳实践。这意味着它将始终具有零偏移量。
你朋友的电脑可能在一个不遵循夏令时的时区。例如(我在这里猜测),也许他在中国使用的"Asia/Shanghai"
时区。由于中国不使用夏令时,他的偏移量永远是UTC+08:00。
您可以在这里看到时区及其偏移量的列表
Javascript中的日期存储为UTC时间,更具体地说,从特定日期(确切地说,1970年1月1日00:00:00)开始以毫秒为单位存储。您可以使用date.toLocaleString()
将它们打印到本地时间。也有专门的时间和日期的方法:date.toLocaleDateString()
和date.toLocaleTimeString()
。它们返回一个字符串,因为要显示本地时间,而不是存储本地时间。
作为一个规则:总是存储和处理日期作为UTC时间,直到你要把它们显示给用户。如果你从用户那里读取本地时间,你需要在尽可能早的时刻将它们转换为UTC时间,并保持这种状态,直到你再次显示它们。
在您的情况下,您在EDT中得到1个日期而在EST中得到1个日期的原因是由于夏令时(将时钟提前或向后设置1小时)。大约有半年的时间,美国东海岸的某些地区(如纽约)与一年中的另一半时间处于不同的时区。在您的情况下,对于使用夏令时的人来说,8月5日和1月27日实际上处于不同的时区。在美国东部时区中,你实际上不可能有1月份的时间,因为该时区只存在于3月中旬和10月中旬之间。
来源:http://www.timeanddate.com/library/abbreviations/timezones/na/edt.html
当你这样做的时候:
new Date(1390802400000) // Mon Jan 27 2014 01:00:00 GMT-0500 (EST)
创建一个新的Date对象,时间值为1390802400000。如果简单地将其写入输出(alert、console等),则提供的默认值与Date相同。toString,它根据本地时区偏移量以方便的格式返回字符串。
如果你想看到UTC的日期,你可以使用toISOString方法:
var d = new Date(1390802400000);
console.log(d.toISOString()); // 2014-01-27T06:00:00.000Z
或者您可以使用UTC方法(例如getUTCHours)并以您喜欢的任何格式构建字符串。
我的电脑是GMT-4,但是为什么最后一行显示的是EST时间而不是EDT时间
因为在那一天,你的计算机认为当地的时区是EST(大概是美国东部标准时间,而不是澳大利亚东部标准时间)。是吗?