如何将日期转换为GMT?

时间:2012-01-20 16:57:55

标签: javascript

如何将不同时区的日期转换为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转换时间。例如,GMT中的Fri Jan 20 2012 11:51:36 GMT-0500Fri Jan 20 2012 16:51:36 GMT而非Fri Jan 20 2012 06:51:36 GMT。 GMT-0500落后于GMT,而不是未来,因此您必须添加偏移以获得GMT,而不是减去它。

10 个答案:

答案 0 :(得分:56)

[更新]

Matt Johnsons的回答比这个好得多。

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

https://stackoverflow.com/a/26454317/334274

答案 1 :(得分:35)

您只需使用日期对象的toUTCString(或toISOString)方法。

示例:

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

// Output:  "Fri, 20 Jan 2012 16:51:36 GMT"

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

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

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

答案 2 :(得分:27)

虽然看起来合乎逻辑,但接受的答案是不正确的,因为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被设计成你不需要的原因。

答案 3 :(得分:18)

只需使用Date.getUTC*()系列方法即可。在我的电脑上(CET,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格式返回正确的小时。

另见:

答案 4 :(得分:2)

我刚刚做这个,我可能有点晚了, 但我做了一个解决方法。 以下是步骤:   - 从应用程序被解雇的任何时区获取当前时间.-   - 从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
}

答案 5 :(得分:1)

GMTDate = new Date()。toGMTString();

答案 6 :(得分:1)

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

void control(bool &x){
while(x==false){
  this_thread::sleep_for(1s);
//it can go out.
}

}

在两次打勾中,有一个来自客户端加号GMT的日期。

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

答案 7 :(得分:0)

我正在尝试下面的内容。这似乎工作正常。这种方法有任何限制吗?请确认。

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

答案 8 :(得分:0)

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

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);

答案 9 :(得分:0)

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

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

在两次打勾中,有一个来自客户端加号GMT的日期。

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