js 获取当前gmt时间_javascript-如何将日期转换为GMT?

尽管看起来很合逻辑,但是可以接受的答案是错误的,因为JavaScript日期不能那样工作。

在此必须特别注意的是,JavaScript中的日期(即new Date()-0或x)的数值始终以毫秒为单位,以纪元为准,该纪元是无时区的量,基于宇宙历史中精确的精确时刻。 您不需要对new Date(x)返回的数值加或减任何东西,就可以将数值转换为时区,因为该数值没有时区。 如果确实具有时区,则JavaScript日期中的其他所有内容均将不起作用。

时区,leap年,leap秒以及对我们当地时间和日期的所有其他无休止的复杂调整,都是基于此一致且明确的数值,而不是相反的。

以下是日期(提供给日期构造函数)的数值如何与时区无关的示例:

在中部标准时间:

new Date(0);

// Wed Dec 31 1969 18:00:00 GMT-0600 (CST)

在阿拉斯加的安克雷奇市:

new Date(0);

// Wed Dec 31 1969 15:00:00 GMT-0900 (AHST)

在法国巴黎:

new Date(0);

// Thu Jan 01 1970 01:00:00 GMT+0100 (CET)

至关重要的是要注意,在所有情况下,基于零毫秒的无时区的纪元偏移,结果时间是相同的。 在法国巴黎,凌晨1点与前一天在阿拉斯加安克雷奇的下午3点完全相同,而在伊利诺伊州芝加哥,则与下午6点完全相同。

因此,此页面上接受的答案不正确。 观察:

// Create a date.

date = new Date();

// Fri Jan 27 2017 18:16:35 GMT-0600 (CST)

// Observe the numerical value of the date.

date.valueOf();

// 1485562595732

// n.b. this value has no timezone and does not need one!!

// Observe the incorrectly "corrected" numerical date value.

date.valueOf() + date.getTimezoneOffset() * 60000;

// 1485584195732

// Try out the incorrectly "converted" date string.

new Date(date.valueOf() + date.getTimezoneOffset() * 60000);

// Sat Jan 28 2017 00:16:35 GMT-0600 (CST)

/* Not the correct result even within the same script!!!! */

如果您在另一个时区中有日期字符串,则无需转换为x创建的结果对象。 为什么? 该日期的JavaScript数值将是相同的,而不管其时区如何。 无论原始时区是什么,JavaScript都会自动执行极其复杂的过程以提取自该纪元以来的原始毫秒数。

最重要的是,将文本日期字符串x插入到new Date(x)构造函数中,将自动从原始时区(无论可能是什么)转换为无时区的时间毫秒表示形式,无论任何时区,该时间都相同。 在实际的应用程序中,您可以选择在所需的任何时区中显示日期,但不要在日期的数值上加/减。 所有转换已在创建日期对象的那一刻发生。 时区已经不存在了,因为使用精确定义且无时区的时间实例化了date对象。

仅当考虑到应用程序的用户时,时区才再次开始存在。 用户确实具有时区,因此您只需向用户显示该时区。 但这也会自动发生。

让我们考虑一下原始问题中的几个日期:

date1 = new Date("Fri Jan 20 2012 11:51:36 GMT-0300");

// Fri Jan 20 2012 08:51:36 GMT-0600 (CST)

date2 = new Date("Fri Jan 20 2012 11:51:36 GMT-0300")

// Fri Jan 20 2012 08:51:36 GMT-0600 (CST)

控制台已经知道我的时区,因此它会自动显示这些时间对我意味着什么。

而且,如果您想知道格林尼治标准时间(GMT)/ UTC表示的时间,则也无需转换! 您根本不会更改时间。 您只需显示时间的UTC字符串即可:

date1.toUTCString();

// "Fri, 20 Jan 2012 14:51:36 GMT"

几乎可以保证使用JavaScript日期的数字值编写的代码可以以数字方式转换时区。 时区太复杂了,这就是设计JavaScript的原因,因此您无需这样做。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值