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

534

我从服务器获取的日期时间变量格式为:6/29/2011 4:52:48 PM,并且它是以UTC时间表示的。 我希望使用JavaScript将其转换为当前用户的浏览器时区。

请问如何使用JavaScript或jQuery实现?


代码示例在此处: https://dev59.com/vG865IYBdhLWcg3wZdxW - Andrew Lewis
7
注意,这是一个奇怪的日期格式,所以一定要在使用任何解决方案时明确指定它。如果可能的话,让服务器以ISO格式发送日期。 - Michael Scheper
你好,我曾经遇到过类似的问题,我通过在将日期/时间发送到服务器之前进行转换来解决它,使用以下代码:var date = new Date('2020-11-06T01:30:00.000Z'); console.log(date.toLocaleDateString()); console.log(date.toLocaleString()); console.log(date.toLocaleTimeString()); - FXLima
我的评论是关于示例: (UTC 巴西) 我输入了“15/12/2020 22:30:00”,它发送了:'2020-12-16T01:30:00.000Z'。 - FXLima
39个回答

14
在末尾添加时区,例如“UTC”:
theDate = new Date( Date.parse('6/29/2011 4:52:48 PM UTC'));

在此之后,使用 toLocale() 函数系列来以正确的区域设置显示日期。

theDate.toLocaleString();  // "6/29/2011, 9:52:48 AM"
theDate.toLocaleTimeString();  // "9:52:48 AM"
theDate.toLocaleDateString();  // "6/29/2011"

13
使用这个工具可以进行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;
}

4
在夏令时改变的时候会发生什么?中欧时间。 - NovusMobile
请查看我的答案 @ https://dev59.com/0Gw15IYBdhLWcg3wkcqq#31453408 - Hulvej

11

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

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

        var hourOffset = convertdLocalTime.getTimezoneOffset() / 60;

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

        return convertdLocalTime;
    }

在调试器中的结果:

UTCDateString: "2014-02-26T00:00:00"
convertdLocalTime: Wed Feb 26 2014 00:00:00 GMT-0800 (Pacific Standard Time)

这是将时间转换为本地时区,如何在日期值中不使用加号或减号将其转换为特定时区? - Kishor

10

如果你不介意使用moment.js,并且你的时间是以UTC为准,请使用以下代码:

moment.utc('6/29/2011 4:52:48 PM').toDate();

如果您的时间不是使用UTC而是其他已知时区,请使用以下方法:

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

如果你的时间已经是本地时间,那么请使用以下方法:

moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY');

6
对我而言,最简单的方法是使用。
datetime.setUTCHours(datetime.getHours());
datetime.setUTCMinutes(datetime.getMinutes());

我原以为第一行足够了,但有些时区的偏差是小数小时级别的。


有人对此有任何问题吗? 这似乎是我最好的选项。 我使用了一个带有“(UTC)”结尾的UTC字符串,将其设置为Date对象,使用new Date('date string'),然后添加了这两行代码,它似乎返回了一个基于服务器UTC时间戳完全匹配用户本地时间的时间,并进行了调整。 我还必须担心怪异的小数小时时区...不确定它是否始终完美地符合要求... - tylerl
尝试了许多其他选项,但都没有起作用,但这个可以。 - Sameera K

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; 
<p>UTC<p>
<p id="dataDate"></p>

<p>Local(GMT +7)<p>
<p id="myLocalDate"></p>

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


你的变量名有错误... 或许最好将你的代码转换为代码片段,这样我们就可以运行和测试了? - Anton
@Anton 谢谢你提醒我。我已经添加了代码片段并修复了我的代码。 - TLVF2627

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

然后,显示本地时间如下:
{{order.createDate | localdate | date : 'MMM d, y h:mm a' }}

5

对我来说,这很有效。

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

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

如果要将日期从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)

需要注意的重要事项

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

3

@Adorojan的答案几乎是正确的。但是添加偏移量是不正确的,因为如果浏览器日期超前于GMT或反之,则偏移值将为负数。 以下是我想出的解决方案,对我来说完美地运作:

// Input time in UTC
var inputInUtc = "6/29/2011 4:52:48";

var dateInUtc = new Date(Date.parse(inputInUtc+" UTC"));
//Print date in UTC time
document.write("Date in UTC : " + dateInUtc.toISOString()+"<br>");

var dateInLocalTz = convertUtcToLocalTz(dateInUtc);
//Print date in local time
document.write("Date in Local : " + dateInLocalTz.toISOString());

function convertUtcToLocalTz(dateInUtc) {
  //Convert to local timezone
  return new Date(dateInUtc.getTime() - dateInUtc.getTimezoneOffset()*60*1000);
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接