如何使JavaScript Date.prototype.toString()始终显示本地时区

时间:2014-08-05 12:43:12

标签: javascript timezone

我设置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),这些计算机只显示当地时区的时间。

但为什么我的电脑显示其他时区的时间?

3 个答案:

答案 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。

You can see a list of time zones and their offsets here.

答案 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(可能是美国东部标准时间,而不是澳大利亚东部标准时间)。是吗?