首页 > 解决方案 > 给定一个时区字符串,我如何在 JS 中将日期对象设置为该 TZ

问题描述

我有这个代码:

toolFilters.filter('dateAccordingToTimeZone', function($filter) {
    // Gets the number of milliseconds pass from 1970 and convert it to time according to given timezone, currently
    // supported “Asia/Jerusalem” and “America/Los_Angeles”
    return function(milliSeconds, timeZoneId) {
        if (milliSeconds == 0) {
            return "";
        }
        var d = new Date();

        var n = d.getTimezoneOffset();

        if ((timeZoneId == "Asia/Jerusalem") || (timeZoneId == "IL")) {
            return $filter('date')(milliSeconds, 'MMM d, y H:mm:ss', '+0200');
        } else if ((timeZoneId == "America/Los_Angeles")) {
            return $filter('date')(milliSeconds, 'MMM d, y H:mm:ss', 'PST');
        } else {
            return $filter('date')(milliSeconds, 'MMM d, y H:mm:ss');
        }
    };
})

我试图让它更通用,所以我创建了一个Date()对象,但我不能用给定的TZ string. 我该怎么做?

然后我想用getTimezoneOffset()

标签: javascriptangularjsdatetimezone

解决方案


如果时区字符串是有效的IANA 时区标识符并且支持Intl 对象,您可以使用Date.prototype.toLocaleString和适当的语言代码,例如

var d = new Date();
console.log(d.toLocaleString('en-GB', {timeZone:'America/Los_Angeles', timeZoneName:'short'}));
console.log(d.toLocaleString('en-GB', {timeZone:'Asia/Jerusalem', timeZoneName:'short'}));
console.log(d.toLocaleString('en-GB', {timeZone:'UTC', timeZoneName:'short'}));

否则,您将需要使用库。编写自己的函数来支持所有区域、时区和夏令时转换可能是不合理的,尽管如果您愿意,可以免费使用 IANA 时区数据库。

TLDR;

偏移量只是本地时间(无论如何确定)和 UTC 之间的差异。时区是观察相同时区偏移的区域。区域和偏移量通常由区域或国家政府等行政机构确定。

一个特定的地方可能位于多个时区,并且根据日期有多个偏移量,例如,澳大利亚悉尼使用澳大利亚东部标准时间 (AEST),冬季为 UTC+1000,澳大利亚东部夏令时间 (AEDT) 为夏季 UTC+1100,因此有两个不同的偏移量和两个不同的时区。澳大利亚布里斯班全年使用 AEST,因此一个偏移量和一个时区。澳大利亚珀斯不时涉足夏令时。诺福克岛将其偏移量从 1951 年的 +11:12 更改为 2015 年的 +1030 至 +11:00,并在 1970 年代观察到一年的夏令时。

尽管 IANA 名称正在成为事实上的标准,但没有命名时区的标准。也没有办法从偏移量中可靠地确定时区,尽管可以根据大多数时间正确的夏季和冬季偏移量做出合理的猜测(但在必须正确的一般情况下不会这样做) .

通常,使用 UTC(零偏移)交换日期,并进行调整仅用于显示目的。这可能会产生应忽略偏移的问题,例如生日。2018 年 1 月 1 日凌晨 04:30 在印度出生的人在纽约时不会说他们出生于 2017 年 12 月 31 日,即使那是他们出生时在纽约的日期。


推荐阅读