将UTCdate时间转换为本地date时间

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

如何使用JavaScript或jQuery做到这一点?

在将其转换为javascript中的date之前,将“UTC”附加到string:

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

这是一个通用的解决scheme:

 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:

 date.toLocaleString(); 

在我看来,服务器应该总是在标准化的ISO 8601格式中返回date时间。

更多信息:

在这种情况下,服务器将返回'2011-06-29T16:52:48.000Z' ,这将直接馈送到JSdate对象。

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

当地localDate将在当地时间正确,在我的情况下是两个小时后(DK时间)。

只要符合服务器期望的格式,就不需要执行所有的parsing操作。

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

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

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

希望这可以帮助。

把这个function放在你的脑海里:

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

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

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

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

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

马特的答案是缺less的事实夏时制可能会不同Date()和它需要转换的date时间 – 这是我的解决scheme:

  function ConvertUTCTimeToLocalTime(UTCDateString) { var convertdLocalTime = new Date(UTCDateString); var hourOffset = convertdLocalTime.getTimezoneOffset() / 60; convertdLocalTime.setHours( convertdLocalTime.getHours() + hourOffset ); return convertdLocalTime; } 

debugging器中的结果是:

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

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

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

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

在尝试了一些没有好结果的post后,这似乎对我有用:

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

而且这种方式的工作方式相反,从本地date到UTC:

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

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

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

(我认为第一行可能就够了,但是有几个小时内closures的时区)

JSONdatestring(在C#中序列化)看起来像“2015-10-13T18:58:17”。

在angular度上,(遵循Hulvej)做一个localdatefilter:

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

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

 {{order.createDate | localdate | date : 'MMM d, yh:mm a' }} 

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

我回答这个如果任何一个想显示转换时间到特定id元素和应用date格式stringyyyy-mm-dd的函数这里date1是string,id是要显示时间的元素的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(); } 

我知道答案已被接受,但我得到这里谷歌的原因,我确实解决从接受的答案获得灵感,所以我只是想分享,如果有人需要。

基于@digitalbath答案,这里是一个小函数来获取UTC时间戳,并显示给定的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> 

使用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格式转换,请确保您的date遵循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分隔date和时间,一些空间在某些浏览器中不起作用
  2. 您必须使用此格式+hh:mm设置时区,使用时区string(例如:“UTC”)在许多浏览器中都不起作用。 +hh:mm代表UTC时区的偏移量。

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

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

对于其他访问者 – 使用此函数从UTCstring获取本地date对象,应该照顾DST,并将工作在IE,iPhone等。

我们分割string(因为JSdateparsing不支持在一些浏览器)我们得到UTC的差异,并从UTC时间减去,这给了我们当地的时间。 由于返回的偏移量是用DST计算的(如果我错了,请纠正我),所以它将把时间设置回variables“utc”。 最后返回date对象。

在Angular中,我用这种方式回答了Ben的回答:

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

编辑:angular1.3.0添加UTC支持datefilter,我还没有使用它,但它应该更容易,这里是格式:

 {{ date_expression | date : format : timezone}} 

Angular 1.4.3 Date API