2011-06-29 312 views
191

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

这是如何使用JavaScript或jQuery完成的?

+0

代码示例:[http:// stackoverflow。COM /问题/ 3830418/IS-有-A-jQuery的插件到转换-UTC-日期时间到本地用户时区(http://stackoverflow.com/questions/3830418/is-there-a -jquery-plugin-to-convert-utc-datetimes-to-local-user-timezone) –

+0

小心。这是一个奇怪的日期格式,所以一定要用你使用的任何解决方案来指定它。如果可能,请让服务器以ISO格式发送日期。 –

回答

238

追加 '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)" 
+4

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()); return date_to_convert.toString(); } – matt

+4

@matt offSet返回分钟数,而不是小时数,您需要除以60 – bladefist

+0

@matt还注意有几个小时关闭的时区。并且当UTC和本地值都有getter和setter函数时,您不需要使用时区偏移 –

26

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

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

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

希望这会有所帮助。

+0

这绝对有帮助,当我将用户输入转换为服务器utc时间, – anIBMer

+2

我怎么知道我是否需要添加或减去来自服务器的时间偏移? – Mou

18

将这个功能在你的脑袋:

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

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

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

'本地化(“2011/6/29 4:52:48”);' 它不工作在FireFox中,因为我使用24小时格式 – BrainCoder

+3

非常感谢。我一直在寻找最有效的方法来本地化UTC时间几小时。你先生是绅士和学者! – jiaoziren

+0

感谢上帝,我撞上了这个答案,否则我会死的。 – niravpatel9898

3

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

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

(我想的第一行可能是足够的,但有时区的开关状态中的小时馏分)

+0

有没有人有任何问题?这对我来说似乎是最好的选择。我使用了一个UTC字符串,在其末尾有“(UTC)”,使用'new Date('date string')'将其设置为Date对象,然后添加了这两行,它似乎正在返回时间基于完全关闭服务器的UTC时间戳,并进行调整以使其与当地用户的时间相匹配。我不必担心奇怪的一小时时间分区......不知道它是否始终保持完美...... – tylerl

56

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

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(); 
+24

不适用于所有时区。 getTimeZoneOffset在几分钟内就有充分的理由! http://www.geographylists.com/list20d.html – siukurnin

+5

@siukurnin。所以要管理奇怪的时区,使用newDate.setTime(date.getTime()+ date.getTimezoneOffset()* 60 * 1000) –

+11

newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset())就足够了。在更正时间内 – Lu55

4

将此用于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

+0

请参阅我的回答@ http://stackoverflow.com/questions/6525538/convert-utc-date-time-to-local-date-time-using-javascript/31453408#31453408 – Hulvej

4

马特的答案是丢失的事实,夏令时可能是日期(),它需要转换的日期时间之间的不同 - 这里是我的解决方案:

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

在角我用本的回答是这样的:

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

编辑:角1.3。0添加日期进行过滤UTC的支持,我没有用它了,但它应该更容易,这里的格式是:

{{ date_expression | date : format : timezone}} 

Angular 1.4.3 Date API

1

我回答这个问题,如果任何人想要的显示转换后的时间函数到特定的id元素并应用日期格式字符串yyyy-mm-dd 此处date1是字符串,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(); 
      } 

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

1

基于@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> 
48

在我看来,服务器应该总是在一般情况下返回标准化的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

+5

@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 – Hulvej

1

使用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 format

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时区的偏移量。
5

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

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

为什么这会在2017年10月9日下调?请写评论以帮助我了解您的意见。 – huha

3

甲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

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

我写了一个可爱的小脚本,需要一个UTC时代和转换它的客户端系统时区和d/M返回它/ YH:我:S(如PHP日期函数)格式:

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; 

}; 
5

尝试一些其他人张贴在这里没有良好的结果后,这似乎为工作我:

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
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日期解析在某些浏览器上不受支持) 我们从UTC获得差异并从中减去UTC时间,这给了我们当地时间。由于返回的偏移量是用DST计算的(纠正我,如果我错了),所以它会将这个时间设置回变量“utc”。最后返回日期对象。

1

这个工作对我来说:

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

对我来说,上述解决方案没有奏效。

随着IE的UTC日期时间转换为本地是有点棘手。 对我而言,web API的日期时间为'2018-02-15T05:37:26.007',我想按照本地时区进行转换,所以我在JavaScript中使用了下面的代码。

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