在JavaScript中将date转换为另一个时区

我正在寻找一个function来将date在一个时区转换为另一个时区。

它需要两个参数,

  • date(格式“2012/04/10 10:10:30 +0000”)
  • 时区string(“亚洲/雅加达”)

时区string在http://en.wikipedia.org/wiki/Zone.tab中描述

有没有一个简单的方法来做到这一点?

对于moment.js用户,您现在可以使用moment-timezone 。 使用它,你的函数看起来像这样:

function toTimeZone(time, zone) { var format = 'YYYY/MM/DD HH:mm:ss ZZ'; return moment(time, format).tz(zone).format(format); } 

被无耻地从: http : //www.techrepublic.com/article/convert-the-local-time-to-another-time-zone-with-this-javascript/6016329

 /** * function to calculate local time * in a different city * given the city's UTC offset */ function calcTime(city, offset) { // create Date object for current location var d = new Date(); // convert to msec // add local time zone offset // get UTC time in msec var utc = d.getTime() + (d.getTimezoneOffset() * 60000); // create new Date object for different city // using supplied offset var nd = new Date(utc + (3600000*offset)); // return time as a string return "The local time in " + city + " is " + nd.toLocaleString(); } 

此function通过提供城市/国家的名称和偏移值来计算时区值

好吧,find了!

我正在使用timezone-js 。 这是代码:

 var dt = new timezoneJS.Date("2012/04/10 10:10:30 +0000", 'Europe/London'); dt.setTimezone("Asia/Jakarta"); console.debug(dt); //return formatted date-time in asia/jakarta 

除Safari之外,大多数桌面(不是移动)浏览器都支持带参数的toLocaleString函数,而旧版浏览器通常会忽略参数。

 new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' }) 

得到它了 !

想要强制显示的date=服务器date,没有马特本地设置(UTC)。

我的服务器是GMT-6 – >新date()。getTimezoneOffset()= 360。

 myTZO = 360; myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO))); alert(myNewDate); 

如果你只是需要转换时区,我已经上传了时空时区的精简版本 ,只有最基本的function。 其〜1KB +数据:

 S.loadData({ "zones": [ "Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6", "Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5", ], "links": [ "Europe/Paris|Europe/Madrid", ] }); let d = new Date(); console.log(S.tz(d, "Europe/Madrid").toLocaleString()); console.log(S.tz(d, "Australia/Sydney").toLocaleString()); 

设置一个年份,月份和date用' – '符号分隔的variables,再加上'T'和HH:mm:ss模式中的时间,然后在string末尾加上+01:00(在我的例子中是时区是+1)。 然后使用这个string作为date构造函数的参数。

 //desired format: 2001-02-04T08:16:32+01:00 dateAndTime = year+"-"+month+"-"+day+"T"+hour+":"+minutes+":00+01:00"; var date = new Date(dateAndTime ); 

我应该注意到,我受限于我可以使用哪个外部库。 moment.js和timezone-js不是我的select。

我拥有的jsdate对象是UTC。 我需要从特定的时区获得date和时间(我的情况是“美国/芝加哥”)。

  var currentUtcTime = new Date(); // This is in UTC // Converts the UTC time to a locale specific format, including adjusting for timezone. var currentDateTimeCentralTimeZone = new Date(currentUtcTime.toLocaleString('en-US', { timeZone: 'America/Chicago' })); console.log('currentUtcTime: ' + currentUtcTime.toLocaleDateString()); console.log('currentUtcTime Hour: ' + currentUtcTime.getHours()); console.log('currentUtcTime Minute: ' + currentUtcTime.getMinutes()); console.log('currentDateTimeCentralTimeZone: ' + currentDateTimeCentralTimeZone.toLocaleDateString()); console.log('currentDateTimeCentralTimeZone Hour: ' + currentDateTimeCentralTimeZone.getHours()); console.log('currentDateTimeCentralTimeZone Minute: ' + currentDateTimeCentralTimeZone.getMinutes()); 

UTC现在比“美国/芝加哥”早6个小时。 输出是:

 currentUtcTime: 11/25/2016 currentUtcTime Hour: 16 currentUtcTime Minute: 15 currentDateTimeCentralTimeZone: 11/25/2016 currentDateTimeCentralTimeZone Hour: 10 currentDateTimeCentralTimeZone Minute: 15 

你也可以试试这个转换date时区到印度:

 var indianTimeZoneVal = new Date().toLocaleString('en-US', {timeZone: 'Asia/Kolkata'}); var indainDateObj = new Date(indianTimeZoneVal); indainDateObj.setHours(indainDateObj.getHours() + 5); indainDateObj.setMinutes(indainDateObj.getMinutes() + 30); console.log(indainDateObj); 

有一个叫做'timezones.json'的npm模块可以用于这个; 它基本上包含一个json文件,其中包含夏令时和偏移信息的对象。

对于亚洲/雅加达,它将能够返回这个对象:

 { "value": "SE Asia Standard Time", "abbr": "SAST", "offset": 7, "isdst": false, "text": "(UTC+07:00) Bangkok, Hanoi, Jakarta", "utc": [ "Antarctica/Davis", "Asia/Bangkok", "Asia/Hovd", "Asia/Jakarta", "Asia/Phnom_Penh", "Asia/Pontianak", "Asia/Saigon", "Asia/Vientiane", "Etc/GMT-7", "Indian/Christmas" ] } 

你可以在这里find它:

https://github.com/dmfilipenko/timezones.json

https://www.npmjs.com/package/timezones.json

希望它是有用的

我不知道一个简单的方法将date对象转换为任何时区,但是如果您想将其转换为本地时区,则可以使用Date.prototype.getTime()将其转换为相应的毫秒数,然后再回来。

 date = new Date('2016-05-24T13:07:20'); date = new Date(date.getTime()); 

例如,如果你像我一样,在奥地利(现在是夏天), date.getHours()现在将返回15而不是13

我已经读过,各种date时间函数可能在某些浏览器中performance出非标准行为,所以先testing一下。 我可以确认它可以在Chrome中使用。