将UTC日期时间转换为本地日期时间

Amr*_*rhy 301 javascript jquery timezone datetime utc

从服务器我得到这种格式的datetime变量:6/29/2011 4:52:48 PM它是UTC时间.我想使用JavaScript将其转换为当前用户的浏览器时间.

如何使用JavaScript或jQuery完成此操作?

dig*_*ath 361

在将字符串转换为javascript中的日期之前,将"UTC"附加到字符串:

var date = new Date('6/29/2011 4:52:48 PM UTC');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
Run Code Online (Sandbox Code Playgroud)

  • 这假设字符串的日期部分遵循美国标准mm/dd/YYYY,这在欧洲和世界其他地方并不明显. (41认同)
  • function localizeDateStr (date_to_convert_str) { var date_to_convert = new Date(date_to_convert_str); var local_date = new Date(); date_to_convert.setHours(date_to_convert.getHours()+local_date.getTimezoneOffset()); 返回 date_to_convert.toString(); } (5认同)
  • @digitalbath适用于Chrome,但不适用于Firefox. (5认同)
  • @matt offSet返回分钟,而不是小时,你需要除以60 (4认同)
  • `!`__Beware ___!`_ [...由于浏览器的差异和不一致性,强烈建议不要使用Date构造函数解析日期字符串(和Date.parse,它们是等效的)...](https://developer.mozilla.org/ en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)(2011年可能更为真实) (2认同)
  • 这个答案不应该是公认的答案。它缺乏常见浏览器的支持,并引入了不良做法。 (2认同)

Hul*_*vej 115

在我看来,服务器应始终在一般情况下返回标准化ISO 8601格式的日期时间.

更多信息:

在这种情况下,服务器将返回'2011-06-29T16:52:48.000Z'直接提供给JS Date对象的服务器.

var utcDate = '2011-06-29T16:52:48.000Z';  // ISO-8601 formatted date returned from server
var localDate = new Date(utcDate);
Run Code Online (Sandbox Code Playgroud)

localDate会在正确的本地时间这在我的情况下,将在两个小时后(DK时间).

真的不需要做所有这些只会使事情变得复杂的解析,只要你与服务器期望的格式一致即可.

  • @Colin是语言依赖的.在C#中,您可以使用`.toString("o")`格式化`DateTime`对象,该对象返回ISO-8601格式的字符串,如上所示.https://msdn.microsoft.com/en-us/library/zdtaw1bw(v=vs.110).aspx在javascript中它是`new Date().toISOString()`.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString (8认同)
  • 由于某种原因,将 UTC 附加到我的时间戳不起作用。但附加一个“z”就可以了。 (2认同)

Ado*_*ncz 93

这是一个通用的解决方案:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date.getTime()+date.getTimezoneOffset()*60*1000);

    var offset = date.getTimezoneOffset() / 60;
    var hours = date.getHours();

    newDate.setHours(hours - offset);

    return newDate;   
}
Run Code Online (Sandbox Code Playgroud)

用法:

var date = convertUTCDateToLocalDate(new Date(date_string_you_received));
Run Code Online (Sandbox Code Playgroud)

根据客户端本地设置显示日期:

date.toLocaleString();
Run Code Online (Sandbox Code Playgroud)

  • 不适用于所有时区.getTimeZoneOffset有几分钟就足够了!http://www.geographylists.com/list20d.html (39认同)
  • newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset())就足够了.在纠正时间也是如此 (15认同)
  • @siukurnin.所以要管理怪异的时区,请使用newDate.setTime(date.getTime()+ date.getTimezoneOffset()*60*1000) (5认同)
  • 当时区转换到午夜时,这似乎也没有正确设置日期; 可能是因为它只使用不影响日期的setHours? (2认同)

Nob*_*ita 36

您应该获得客户端的(UTC)偏移量(以分钟为单位):

var offset = new Date().getTimezoneOffset();
Run Code Online (Sandbox Code Playgroud)

然后通过对应的添加或减少从服务器获得的时间.

希望这可以帮助.

  • 夏令时呢? (4认同)

Ben*_*ant 20

将此功能放在头脑中:

<script type="text/javascript">
function localize(t)
{
  var d=new Date(t+" UTC");
  document.write(d.toString());
}
</script>
Run Code Online (Sandbox Code Playgroud)

然后为页面正文中的每个日期生成以下内容:

<script type="text/javascript">localize("6/29/2011 4:52:48 PM");</script>
Run Code Online (Sandbox Code Playgroud)

要删除GMT和时区,请更改以下行:

document.write(d.toString().replace(/GMT.*/g,""));
Run Code Online (Sandbox Code Playgroud)


小智 19

对我而言,上述解决方案无效.

使用IE,将UTC日期时间转换为本地有点棘手.对我来说,来自Web API的日期时间是'2018-02-15T05:37:26.007',我想按照本地时区进行转换,所以我在JavaScript中使用了以下代码.

var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');
Run Code Online (Sandbox Code Playgroud)

  • @Kumaresan,是的,这是最好的解决方案,即使评级较低,也适用于 Firefox 和 Chromium (2认同)

Mar*_*avi 16

如果你有

“2021-12-28T18:00:45.959Z”格式

你可以在js中使用它:

// myDateTime is 2021-12-28T18:00:45.959Z

myDate = new Date(myDateTime).toLocaleDateString('en-US');
// myDate is 12/28/2021

myTime = new Date(myDateTime).toLocaleTimeString('en-US');
// myTime is 9:30:45 PM
Run Code Online (Sandbox Code Playgroud)

您只需输入您的区域字符串而不是“en-US”(例如“fa-IR”)。


您还可以使用toLocaleTimeString类似 { hour: '2-digit', 分钟: '2-digit' }的选项

myTime = new Date(myDateTime).toLocaleTimeString('en-US',{ hour: '2-digit', minute: '2-digit' });
// myTime is 09:30 PM
Run Code Online (Sandbox Code Playgroud)

有关toLocaleTimeStringtoLocaleDateString的更多信息


Mol*_*ght 15

这对我有用:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
    return newDate;   
}
Run Code Online (Sandbox Code Playgroud)


Uni*_*nic 10

在尝试了其他几个没有好结果的人之后,这似乎对我有用:

convertUTCDateToLocalDate: function (date) {
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(),  date.getHours(), date.getMinutes(), date.getSeconds()));
}
Run Code Online (Sandbox Code Playgroud)

从Local Date到UTC,这种方式正好相反:

convertLocalDatetoUTCDate: function(date){
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),  date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}
Run Code Online (Sandbox Code Playgroud)

  • 使用 `new Date(+date + date.getTimezoneOffset() * 6e4)` 的代码更少。;-) (3认同)

小智 9

用于UTC和本地时间转换,反之亦然.

//Covert datetime by GMT offset 
//If toUTC is true then return UTC time other wise return local time
function convertLocalDateToUTCDate(date, toUTC) {
    date = new Date(date);
    //Local time converted to UTC
    console.log("Time: " + date);
    var localOffset = date.getTimezoneOffset() * 60000;
    var localTime = date.getTime();
    if (toUTC) {
        date = localTime + localOffset;
    } else {
        date = localTime - localOffset;
    }
    date = new Date(date);
    console.log("Converted time: " + date);
    return date;
}
Run Code Online (Sandbox Code Playgroud)

  • 夏令时发生了什么.CET时区 (3认同)

adn*_*ili 9

如果您不介意使用moment.js并且您的时间是UTC,请使用以下内容:

moment.utc('6/29/2011 4:52:48 PM').toDate();
Run Code Online (Sandbox Code Playgroud)

如果您的时间不在utc中,而是您知道的任何其他语言环境,请使用以下内容:

moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY', 'fr').toDate();
Run Code Online (Sandbox Code Playgroud)

如果您的时间已经在当地,请使用以下内容:

moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY');
Run Code Online (Sandbox Code Playgroud)


Mau*_*rGi 8

Matt的答案是错过了Date()和它需要转换的日期时间之间的夏令时可能不同的事实 - 这是我的解决方案:

    function ConvertUTCTimeToLocalTime(UTCDateString)
    {
        var convertdLocalTime = new Date(UTCDateString);

        var hourOffset = convertdLocalTime.getTimezoneOffset() / 60;

        convertdLocalTime.setHours( convertdLocalTime.getHours() + hourOffset ); 

        return convertdLocalTime;
    }
Run Code Online (Sandbox Code Playgroud)

调试器中的结果:

UTCDateString: "2014-02-26T00:00:00"
convertdLocalTime: Wed Feb 26 2014 00:00:00 GMT-0800 (Pacific Standard Time)
Run Code Online (Sandbox Code Playgroud)


huh*_*uha 8

这是一个基于Adorjan Princ答案的简化解决方案:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date);
    newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset());
    return newDate;
}
Run Code Online (Sandbox Code Playgroud)

用法:

var date = convertUTCDateToLocalDate(new Date(date_string_you_received));
Run Code Online (Sandbox Code Playgroud)


pab*_*a98 8

在末尾添加时区,在本例中为“ UTC”:

theDate = new Date( Date.parse('6/29/2011 4:52:48 PM UTC'));
Run Code Online (Sandbox Code Playgroud)

之后,使用toLocale()*函数族以正确的语言环境显示日期

theDate.toLocaleString();  // "6/29/2011, 9:52:48 AM"
theDate.toLocaleTimeString();  // "9:52:48 AM"
theDate.toLocaleDateString();  // "6/29/2011"
Run Code Online (Sandbox Code Playgroud)


TLV*_*627 6

这就是我将 UTC 转换为本地时间的方法:

const dataDate = '2020-09-15 07:08:08'
const utcDate = new Date(dataDate);
const myLocalDate = new Date(Date.UTC(
   utcDate.getFullYear(),
   utcDate.getMonth(),
   utcDate.getDate(),
   utcDate.getHours(),
   utcDate.getMinutes()
));

document.getElementById("dataDate").innerHTML = dataDate; 
document.getElementById("myLocalDate").innerHTML = myLocalDate; 
Run Code Online (Sandbox Code Playgroud)
<p>UTC<p>
<p id="dataDate"></p>

<p>Local(GMT +7)<p>
<p id="myLocalDate"></p>
Run Code Online (Sandbox Code Playgroud)

结果:2020 年 9 月 15 日星期二 14:08:00 GMT+0700(印度支那时间)。


miz*_*shu 5

对我来说,最简单的方法似乎是使用

datetime.setUTCHours(datetime.getHours());
datetime.setUTCMinutes(datetime.getMinutes());
Run Code Online (Sandbox Code Playgroud)

(我以为第一行可能就够了,但是有些时区会在几分之一小时内消失)


Gud*_*ain 5

使用YYYY-MM-DD hh:mm:ss格式:

var date = new Date('2011-06-29T16:52:48+00:00');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
Run Code Online (Sandbox Code Playgroud)

要从YYYY-MM-DD hh:mm:ss格式转换,请确保您的日期遵循ISO 8601 格式

Year: 
    YYYY (eg 1997)    
Year and month: 
    YYYY-MM (eg 1997-07)
Complete date: 
    YYYY-MM-DD (eg 1997-07-16)
Complete date plus hours and minutes:
    YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)    
Complete date plus   hours, minutes and seconds:
    YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)    
Complete date plus hours, minutes, seconds and a decimal fraction of a second
    YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00) where:

YYYY = four-digit year
MM   = two-digit month (01=January, etc.)
DD   = two-digit day of month (01 through 31)
hh   = two digits of hour (00 through 23) (am/pm NOT allowed)
mm   = two digits of minute (00 through 59)
ss   = two digits of second (00 through 59)
s    = one or more digits representing a decimal fraction of a second
TZD  = time zone designator (Z or +hh:mm or -hh:mm)
Run Code Online (Sandbox Code Playgroud)

需要注意的重要事项

  1. 您必须用 a 分隔日期和时间T,空格在某些浏览器中不起作用
  2. 您必须使用这种格式设置时区+hh:mm,使用字符串作为时区(例如:'UTC')在许多浏览器中不起作用。+hh:mm表示与 UTC 时区的偏移量。


小智 5

JSON 日期字符串(在 C# 中序列化)看起来像“2015-10-13T18:58:17”。

在 angular 中,(在 Hulvej 之后)做一个localdate过滤器:

myFilters.filter('localdate', function () {
    return function(input) {
        var date = new Date(input + '.000Z');
        return date;
    };
})
Run Code Online (Sandbox Code Playgroud)

然后,显示本地时间,如:

{{order.createDate | localdate | date : 'MMM d, y h:mm a' }}
Run Code Online (Sandbox Code Playgroud)


C.L*_*Lee 5

对我来说,这很有效

if (typeof date === "number") {
  time = new Date(date).toLocaleString();
  } else if (typeof date === "string"){
  time = new Date(`${date} UTC`).toLocaleString();
}
Run Code Online (Sandbox Code Playgroud)