我设置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),这些计算机只显示当地时区的时间。
但为什么我的电脑显示其他时区的时间?
答案 0 :(得分:7)
代码运行正常。这就是时区实际工作的方式。希望一些适当的术语能够清除你的困惑。
A"时区偏移" 不与"时区"相同。您可以在"时区!=偏移"部分中阅读更多相关信息。在the timezone tag wiki。
你说:
我的电脑是GMT-4
这是不正确的。您的计算机位于北美和东部时间#34;时区。在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,因为该值是1月份,即冬天。
你也说过:
我也在其他计算机上尝试相同的代码,例如EC2实例(GMT + 0)和我的朋友(GMT + 8),这些计算机只显示当地时区的时间。
EC2实例可能配置为UTC。这是服务器的最佳实践。这意味着它总是具有零偏移量。它不会因夏令时而改变。
您朋友的计算机可能处于不遵守夏令时的时区。例如(我在这里猜测),也许他在"Asia/Shanghai"
时区,在中国使用。由于中国不使用夏令时,因此他的抵消时间为UTC + 08:00。
答案 1 :(得分:4)
Javascript中的日期存储为UTC时间,更具体地说是自特定日期(准确地说是1/1/1970 00:00:00)以毫秒为单位。您可以使用date.toLocaleString()
将它们打印到当地时间。还有一些具体的方法可以只考虑时间和日期:date.toLocaleDateString()
和date.toLocaleTimeString()
。这些返回一个字符串,因为本地时间是为了显示而不是存储。
通常:始终将日期存储和处理为UTC时间,直到您将其显示给用户。如果您正在从用户那里阅读当地时间,则需要尽早将它们转换为UTC时间,并保持原样,直到再次显示它们为止。
在您的情况下,您在EDT中获得1个日期而在EST中获得1个日期的原因是夏令时(将您的时钟提前1小时或后退)。大约一半的时间里,美国东海岸的某些地区(如纽约)所处的时区与另一半时间不同。在您的情况下,对于那些使用DST的人来说,8月5日和1月27日实际上处于不同的时区。你实际上在1月份没有时间在美国东部时间,因为该时区只存在于3月中旬和中秋佳节之间。
来源:http://www.timeanddate.com/library/abbreviations/timezones/na/edt.html
答案 2 :(得分:2)
当你这样做时:
new Date(1390802400000) // Mon Jan 27 2014 01:00:00 GMT-0500 (EST)
使用time value 1390802400000创建一个新的Date对象。如果只是将其写入输出(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(可能是美国东部标准时间,而不是澳大利亚东部标准时间)。是吗?