在 JavaScript 中将日期转换为其他时区

2022-08-29 23:14:13

我正在寻找一个将一个时区中的日期转换为另一个时区的函数。

它需要两个参数,

  • 日期(格式为“2012/04/10 10:10:30 +0000”)
  • 时区字符串(“亚洲/雅加达”)

时区字符串在 http://en.wikipedia.org/wiki/Zone.tab

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


答案 1

这是单行:

function convertTZ(date, tzString) {
    return new Date((typeof date === "string" ? new Date(date) : date).toLocaleString("en-US", {timeZone: tzString}));   
}

// usage: Asia/Jakarta is GMT+7
convertTZ("2012/04/20 10:10:30 +0000", "Asia/Jakarta") // Tue Apr 20 2012 17:10:30 GMT+0700 (Western Indonesia Time)

// Resulting value is regular Date() object
const convertedDate = convertTZ("2012/04/20 10:10:30 +0000", "Asia/Jakarta") 
convertedDate.getHours(); // 17

// Bonus: You can also put Date object to first arg
const date = new Date()
convertTZ(date, "Asia/Jakarta") // current date-time in jakarta.

   

这是 MDN 参考

注意注意:上面的函数通过依赖于解析到LocaleString结果来工作,该结果是以locale格式设置的日期字符串,例如。每个浏览器可能不接受其 Date 构造函数的格式化日期字符串,并且可能会返回意外结果(可能会忽略夏令时)。en-US"4/20/2012, 5:10:30 PM"en-US

目前,所有现代浏览器都接受此格式并正确计算夏令时,它可能不适用于较旧的浏览器和/或异国情调的浏览器。

旁注:如果现代浏览器必须使用LocaleDate功能,那就太好了,这样我们就不必使用这个黑客工作了。


答案 2

对于.js用户,您现在可以使用时刻时区。使用它,您的函数将如下所示:

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