如何使JavaScript Date.prototype.toString()始终显示本地时区
我设置了UTC+0时间,并希望它显示在每台计算机本地时区的不同计算机上。 但是,当我在我的计算机(VMware VM)中运行Chrome中的代码时,它给了我以下信息:如何使JavaScript Date.prototype.toString()始终显示本地时区,javascript,timezone,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(14
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,但为什么最后一行显示的是美国东部标准时间而不是美国东部标准时间
我还尝试在其他计算机上使用相同的代码,例如EC2实例(GMT+0)和我朋友的(GMT+8),这些计算机将只显示其本地时区的时间
但是为什么我的计算机显示其他时区的时间呢?Javascript中的日期存储为UTC时间,更具体地说是从特定日期(确切地说是1970年1月1日00:00:00)起的毫秒数。您可以使用
date.toLocalString()
将它们打印到当地时间。对于时间和日期也有特定的方法:date.toLocaleDateString()
和date.toLocaleTimeString()
。它们返回一个字符串,因为本地时间是用来显示的,而不是用来存储的
作为一项规则:始终将日期存储和处理为UTC时间,直到您将其显示给用户为止。如果您正在从用户处读取本地时间,则需要尽早将其转换为UTC时间,并将其保持为UTC时间,直到再次显示为止
在您的情况下,您在EDT中获得1个日期,在EST中获得1个日期的原因是由于夏令时(将时钟向前或向后设置1小时)。在大约半年的时间里,美国东海岸的某些地区(如纽约)与另一半的时间处于不同的时区。在你的例子中,8月5日和1月27日对于那些使用DST的人来说实际上是在不同的时区。实际上,你不能在EDT中有一个1月份的时间,因为这个时区只存在于3月中旬和俄克拉荷马州中期之间 来源:当您执行以下操作时:
new Date(1390802400000) // Mon Jan 27 2014 01:00:00 GMT-0500 (EST)
将创建一个新的日期对象,其值为139080240000。如果只是将其写入输出(警报、控制台等),则提供的默认值与Date.toString相同,后者根据本地时区偏移量以方便的格式返回字符串
如果希望将日期视为UTC,可以使用以下方法:
或者,您可以使用UTC方法(例如)以您喜欢的任何格式构建字符串
我的电脑是GMT-4,但为什么最后一行显示的是美国东部标准时间而不是美国东部标准时间
因为在那一天,你的计算机认为本地时区是EST(大概是美国东部标准时间,而不是澳大利亚东部标准时间)。是吗?代码工作正常。时区实际上就是这样工作的。希望一些合适的术语能帮你消除困惑 “时区偏移”与“时区”不同。您可以在中的“时区!=偏移量”一节中了解更多有关这方面的信息 你说: 我的电脑是GMT-4 这是不正确的。您的计算机位于北美“东部时区”。在Linux/Mac上,这可能显示为
“America/NewYork”
。在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
新日期(139080240000)
显示为EST,因为该值在冬季的一月
你还说,
我还尝试在其他计算机上使用相同的代码,例如EC2实例(GMT+0)和我朋友的(GMT+8),这些计算机将只显示其本地时区的时间
EC2实例可能配置为UTC。这是服务器的最佳实践。这意味着它将始终具有零偏移。它不会因夏令时而改变
您朋友的计算机可能位于不遵循夏令时的时区。例如(我在这里猜测),也许他在中国使用的“亚洲/上海”
时区。由于中国不使用夏令时,他的偏移量永久为UTC+08:00
谢谢!但为什么我的计算机在执行“new Date()”时一开始认为我在EDT,后来在执行“new Date(139080240000)”时又认为我在EST?其他计算机没有这个问题,只有我的EDT计算机有这个问题。请参阅我答案的最后一段和Matt的答案。您可以将系统设置更改为不遵守夏令时,或者直接将所需的偏移设置为UTC-05:00,或者选择一个具有适当偏移但不具有夏令时的区域。起初我以为我的代码工作不正常,但现在我知道它是正确的,所以我不需要更改任何内容,只需格式化日期和显示。非常感谢@FlyingHorse很高兴你把它整理好了。:-)您的解释很清楚,但我只希望Date对象在我的EDT计算机上显示EDT(GMT-4)时间。为什么“new Date()”有效而“new Date(139080240000)”无效(显示EST时间)。它可能与夏令时(DST)有关。东部夏令时和东部夏令时是同一时区,但在一年中的不同时段。实际上,在俄克拉荷马州中部和3月中旬之间,美国东海岸的某些地区(如纽约)并不存在EDT。我将修改我的答案以反映这一点。在许多计算机上,即使在使用夏令时的地方,也可以选择不遵守夏令时,因此可以为所有本地日期获取“标准时间”。@RobG-是的,这是正确的,至少在Windows上是如此。然而,绕过DST规则几乎从来都不是一个好主意。世界上有几个分散的地方需要这样做,但绝大多数地方都有自己的地方
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