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


336

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

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


此处的代码示例:http
Andrew Lewis

1
小心。这是一个奇怪的日期格式,因此请确保在使用的任何解决方案中都指定它。如果可能,请让服务器以ISO格式发送日期。
Michael Scheper'1

Answers:


402

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

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

5
函数localizeDateStr(date_to_convert_str){var date_to_convert =新的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(); }
马特

4
@matt offSet返回分钟,而不是小时,您需要除以60
Bladefist

50
假设字符串的日期部分遵循美国标准mm / dd / YYYY,而欧洲和世界其他地区显然不是这样。
AsGoodAsItGet's

7
@digitalbath在Chrome上有效,但在Firefox上无效。
Ganesh Satpute


137

在我看来,服务器通常应始终以标准化的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);

该时间localDate将在正确的本地时间(在我的情况下为两个小时)(DK时间)。

只要您与服务器期望的格式保持一致,您实际上就不必执行所有使事情复杂化的解析过程。


1
如何获取iso格式的日期?我要以UTC格式获取日期,并在末尾附加UTC
Deepika

8
@Colin与语言有关。在C#中,您可以格式化DateTime对象,.toString("o")并使用该对象返回ISO-8601格式的字符串,如上所示。msdn.microsoft.com/zh-CN/library/zdtaw1bw(v=vs.110).aspx在javascript中是new Date().toISOString()developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/…–
Hulvej 2015年

98

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

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

用法:

var date = convertUTCDateToLocalDate(new Date(date_string_you_received));

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

date.toLocaleString();

41
不适用于所有时区。有充分的理由为什么getTimeZoneOffset只需几分钟!geographylists.com/list20d.html
siukurnin

5
@siukurnin。因此要管理怪异的时区,请使用newDate.setTime(date.getTime()+ date.getTimezoneOffset()* 60 * 1000)
Guillaume Gendre 2013年

18
newDate.setMinutes(date.getMinutes()-date.getTimezoneOffset())就足够了。同样在正确的时间
Lu55

1
可以肯定的是,这在30分钟之外的任何时区都无法正常工作吗?似乎四舍五入到整个小时。
NickG '16

2
当时区偏移超过午夜时,这似乎也无法正确设置日期。可能是因为它仅使用setHours而不影响日期?
Uniphonic

37

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

var offset = new Date().getTimezoneOffset();

然后对从服务器获得的时间进行相应的添加或减去。

希望这可以帮助。


2
DST呢?
丰富

26

对我来说,以上解决方案都行不通。

使用IE时,UTC日期时间转换为本地时比较麻烦。对我来说,Web API的日期时间是'2018-02-15T05:37:26.007',我想按本地时区进行转换,因此我在JavaScript中使用了以下代码。

var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');

21

将此功能放在您的脑海:

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

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

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

要删除格林尼治标准时间和时区,请更改以下行:

document.write(d.toString().replace(/GMT.*/g,""));

20

这对我有用:

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

10

在尝试了一些其他在此处发布但未取得良好结果的文件之后,这似乎对我有用:

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

从本地日期到UTC,这是相反的:

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

1
使用的代码更少new Date(+date + date.getTimezoneOffset() * 6e4)。;-)
RobG

它不会起作用,我在utc的时间是“ 2020-04-02T11:09:00”,所以从新加坡尝试了这个,新日期(+新日期(“ 2020-04-02T11:09:00”))新日期( “ 2020-04-02T11:09:00”)。getTimezoneOffset()* 6e4),给出了错误的时间
AhammadaliPK

新的Date(“ 2020-04-02T11:09:00” +'Z')有效;
AhammadaliPK

10

在末尾添加时区,在本例中为“ 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"

9

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)

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

3
夏令时发生了什么。CET时区
NovusMobile 2015年

看到我的答案@ stackoverflow.com
questions/6525538

9

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

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date);
    newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset());
    return newDate;
}

用法:

var date = convertUTCDateToLocalDate(new Date(date_string_you_received));

为什么在2017年10月9日对此表示反对?请发表评论以帮助我理解您的意见。
huha

9

如果您不介意使用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');

5

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

datetime.setUTCHours(datetime.getHours());
datetime.setUTCMinutes(datetime.getMinutes());

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


有人对此有任何疑问吗?这对我来说似乎是最好的选择。我使用了一个UTC字符串,该字符串的末尾带有“(UTC)”,使用将它设置为Date对象new Date('date string'),然后添加了这两行,看来返回的时间完全基于服务器的UTC时间戳。进行调整以使其与用户的本地时间匹配。我确实也要担心一个小时的时区的怪异...不确定它是否在所有时间都完美保存...
tylerl '16

尝试了许多其他选择,但都
无济于事

5

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

用角形(跟随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' }}

3

使用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's答案几乎是正确的。但是添加偏移量是不正确的,因为如果浏览器日期早于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);
}


3

对我来说,这很好

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

2

我回答这个问题如果有人想要将转换后的时间显示到特定id元素并应用日期格式字符串yyyy-mm-dd的函数,则date1是字符串,而ids是该时间要显示的元素的id。

function convertUTCDateToLocalDate(date1, ids) 
{
  var newDate = new Date();
  var ary = date1.split(" ");
  var ary2 = ary[0].split("-");
  var ary1 = ary[1].split(":");
  var month_short = Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
  newDate.setUTCHours(parseInt(ary1[0]));
  newDate.setUTCMinutes(ary1[1]);
  newDate.setUTCSeconds(ary1[2]);
  newDate.setUTCFullYear(ary2[0]);
  newDate.setUTCMonth(ary2[1]);
  newDate.setUTCDate(ary2[2]);
  ids = document.getElementById(ids);
  ids.innerHTML = " " + newDate.getDate() + "-" + month_short[newDate.getMonth() - 1] + "-" + newDate.getFullYear() + " " + newDate.getHours() + ":" + newDate.getMinutes() + ":" + newDate.getSeconds();
            }

我知道答案已经被接受,但是我到达了Google的原因,并且确实从接受的答案中得到了启发,所以我确实想在有人需要的情况下分享它。


1

基于@digitalbath答案,这是一个小功能,可获取U​​TC时间戳并在给定DOM元素中显示本地时间(最后一部分使用jQuery):

https://jsfiddle.net/moriz/6ktb4sv8/1/

<div id="eventTimestamp" class="timeStamp">
   </div>
   <script type="text/javascript">
   // Convert UTC timestamp to local time and display in specified DOM element
   function convertAndDisplayUTCtime(date,hour,minutes,elementID) {
    var eventDate = new Date(''+date+' '+hour+':'+minutes+':00 UTC');
    eventDate.toString();
    $('#'+elementID).html(eventDate);
   }
   convertAndDisplayUTCtime('06/03/2015',16,32,'eventTimestamp');
   </script>

0

我编写了一个不错的小脚本,它采用UTC时代并将其转换为客户端系统时区,并以d / m / YH:i:s(如PHP date函数)格式返回:

getTimezoneDate = function ( e ) {

    function p(s) { return (s < 10) ? '0' + s : s; }        

    var t = new Date(0);
    t.setUTCSeconds(e);

    var d = p(t.getDate()), 
        m = p(t.getMonth()+1), 
        Y = p(t.getFullYear()),
        H = p(t.getHours()), 
        i = p(t.getMinutes()), 
        s = p(t.getSeconds());

    d =  [d, m, Y].join('/') + ' ' + [H, i, s].join(':');

    return d;

};

0

您可以使用momentjsmoment(date).format()将始终以本地日期显示结果。

红利,您可以按任何需要的格式进行格式化。例如。

moment().format('MMMM Do YYYY, h:mm:ss a'); // September 14th 2018, 12:51:03 pm
moment().format('dddd');                    // Friday
moment().format("MMM Do YY"); 

有关更多详细信息,请访问Moment js网站。


0

您可以使用moment.js文件完成操作。

很简单,您只需提及时区的位置。

示例:如果要将日期时间转换为亚洲/加尔各答时区,则只需提及从moment.js获得的时区地点的名称

var UTCDateTime="Your date obtained from UTC";
var ISTleadTime=(moment.tz(UTCDateTime, "Africa/Abidjan")).tz("Asia/Kolkata").format('YYYY-MM-DD LT');


0

我创建了一个函数,将所有时区转换为本地时间。

我没有使用getTimezoneOffset(),因为它没有返回正确的偏移值

要求:

1. npm i moment-timezone

function utcToLocal(utcdateTime, tz) {
    var zone = moment.tz(tz).format("Z") // Actual zone value e:g +5:30
    var zoneValue = zone.replace(/[^0-9: ]/g, "") // Zone value without + - chars
    var operator = zone && zone.split("") && zone.split("")[0] === "-" ? "-" : "+" // operator for addition subtraction
    var localDateTime
    var hours = zoneValue.split(":")[0]
    var minutes = zoneValue.split(":")[1]
    if (operator === "-") {
        localDateTime = moment(utcdateTime).subtract(hours, "hours").subtract(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
    } else if (operator) {
        localDateTime = moment(utcdateTime).add(hours, "hours").add(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
    } else {
        localDateTime = "Invalid Timezone Operator"
    }
    return localDateTime
}

utcToLocal("2019-11-14 07:15:37", "Asia/Kolkata")

//Returns "2019-11-14 12:45:37"

0

就我而言,我必须找出以秒为单位的日期差。该日期是UTC日期字符串,因此我将其转换为本地日期对象。这是我所做的:

let utc1 = new Date();
let utc2 = null;
const dateForCompare = new Date(valueFromServer);
dateForCompare.setTime(dateForCompare.getTime() - dateForCompare.getTimezoneOffset() * 
 60000);
utc2 = dateForCompare;

const seconds = Math.floor(utc1 - utc2) / 1000;

-1
function getUTC(str) {
    var arr = str.split(/[- :]/);
    var utc = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
    utc.setTime(utc.getTime() - utc.getTimezoneOffset()*60*1000)
    return utc;
}

对于其他访问者-使用此功能从UTC字符串获取本地日期对象,应注意DST并可以在IE,iPhone等上使用。

我们分割字符串(由于某些浏览器不支持JS Date解析),我们与UTC有所不同,并从UTC时间中减去了它,从而得到了本地时间。由于返回的偏移量是用DST计算的(如果我写错了,请纠正我),因此它将在变量“ utc”中设置该时间。最后返回日期对象。


-1

在Angular中,我这样使用Ben的答案:

$scope.convert = function (thedate) {
    var tempstr = thedate.toString();
    var newstr = tempstr.toString().replace(/GMT.*/g, "");
    newstr = newstr + " UTC";
    return new Date(newstr);
};

编辑:Angular 1.3.0在日期过滤器中添加了UTC支持,我还没有使用它,但是它应该更容易一些,格式如下:

{{ date_expression | date : format : timezone}}

Angular 1.4.3日期API

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.