如何将日期转换为格林威治标准时间

How can I convert a date to GMT?

本文关键字:格林威治 标准时间 转换 日期      更新时间:2023-09-26

如何将不同时区的日期转换为GMT 0?假设我有这样的约会

Fri Jan 20 2012 11:51:36 GMT-0500
Fri Jan 20 2012 11:51:36 GMT-0300
Fri Jan 20 2012 11:51:36 GMT+0500

Fri Jan 20 2012 06:51:36 GMT
Fri Jan 20 2012 08:51:36 GMT
Fri Jan 20 2012 16:51:36 GMT

这些是我通过不同时区的new Date().toString()获得的日期。有没有js方法来检测时区并相应地进行转换?

编辑:后三个日期不是前三个的GMT转换时间。例如,格林威治标准时间中的Fri Jan 20 2012 11:51:36 GMT-0500 Fri Jan 20 2012 16:51:36 GMT不是Fri Jan 20 2012 06:51:36 GMT。GMT-0500 落后于 GMT,而不是领先,因此您必须添加偏移量才能获得 GMT,而不是减去它。

Matt Johnson-Pint的回答比这个要好得多。

console.log(new Date("Fri Jan 20 2012 11:51:36 GMT-0500").toUTCString())

您可以简单地使用 date 对象的 toUTCString(或 toISOString(方法。

例:

new Date("Fri Jan 20 2012 11:51:36 GMT-0500").toUTCString()
// Output:  "Fri, 20 Jan 2012 16:51:36 GMT"

如果您希望更好地控制输出格式,请考虑使用 date-fns 或 moment.js 等库。

另外,在您的问题中,您实际上错误地转换了时间。 当时间戳字符串中显示偏移量时,这意味着字符串中的日期和时间值从 UTC 调整了该值。 要转换回 UTC,请在应用偏移量之前反转符号。

11:51:36 -0300  ==  14:51:36Z

虽然看起来合乎逻辑,但接受的答案是不正确的,因为 JavaScript 日期不是那样工作的。

这里需要注意的是,JavaScript 中日期(即 new Date()-0Date.now()(的数值总是以自纪元以来的毫秒来测量,纪元是一个基于宇宙历史中精确时刻的无时区量。您无需对从 Date() 返回的数值添加或减去任何内容即可将数值转换为时区,因为数值没有时区。如果它确实有时区,JavaScript 日期中的其他所有内容都不起作用。

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

下面是日期的数值(提供给日期构造函数(如何独立于时区的示例:

在中部标准时间:

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!!!! */

如果日期字符串位于其他时区,则无需转换为 new Date("date string") 创建的结果对象。为什么?无论时区如何,JavaScript 该日期的数值都是相同的。JavaScript 会自动经历极其复杂的过程来提取自纪元以来的原始毫秒数,无论原始时区是什么。

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

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

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

   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被设计成不需要的原因。

只需使用Date.getUTC*()系列方法即可。在我的计算机上(欧洲中部时间,UTC+01:00(:

new Date().toString()
//Fri Jan 20 2012 18:05:16 GMT+0100 (CET)
new Date().getHours()
//18
new Date().getUTCHours()
//17

请注意,getUTCHours()以 UTC 格式返回正确的小时数。

另请参阅:

  • 烦人的JavaScript时区调整问题

我只是在研究这个,我可能有点晚了,但我做了一个解决方法。以下是步骤: - 从应用程序触发的任何时区获取当前时间。 - 从 gmt 0 获取该区域的时区偏移量。然后将时区值添加到 毫秒。 您将获得您所在时区的日期。我添加了一些额外的代码来删除实际时间之后的任何内容。

getCurrentDate() {
    var date = new Date();
    var newDate = new Date(8 * 60 * 60000 + date.valueOf() + 
                           (date.getTimezoneOffset() * 60000));
    var ampm = newDate.getHours() < 12 ? ' AM' : ' PM';
    var strDate = newDate + '';
    return (strDate).substring(0, strDate.indexOf(' GMT')) + ampm
}

根据评论,根据接受的答案和得分第二高的答案,两者都不完美,所以我混合了两者以获得完美的东西:

var date = new Date(); //Current timestamp
date = date.toGMTString(); 
//Based on the time zone where the date was created
console.log(date);
/*based on the comment getTimezoneOffset returns an offset based 
on the date it is called on, and the time zone of the computer the code is
 running on. It does not supply the offset passed in when constructing a 
date from a string. */
date = new Date(date); //will convert to present timestamp offset
date = new Date(date.getTime() + (date.getTimezoneOffset() * 60 * 1000)); 
console.log(date);

我正在尝试以下内容。这似乎工作正常。这种方法有什么限制吗?请确认。

var now=new Date();                         // Sun Apr 02 2017 2:00:00 GMT+1000 (AEST)
var gmtRe = /GMT(['-'+]?'d{4})/;
var tz = gmtRe.exec(now)[1];               // +1000
var hour=tz/100;                           // 10
var min=tz%100;                            // 0
now.setHours(now.getHours()-hour);
now.setMinutes(now.getMinutes()-min);      // Sat Apr 01 2017 16:00:00 GMT

搜索了一两个小时后,我在下面找到了一个简单的解决方案。

const date = new Date(`${date from client} GMT`);

在双刻度内,有一个来自客户端的日期加上格林威治标准时间。

我是第一次评论,欢迎建设性的批评。

GMTDate = new Date((.toGMTString((;

搜索了一两个小时后,我在下面找到了一个简单的解决方案。

const date = new Date(`${date from client} GMT`);

在双刻度内,有一个来自客户端的日期加上格林威治标准时间。

我是第一次评论,欢迎建设性的批评。