给定一个时区字符串,如何在JS中为该TZ设置日期对象

时间:2018-04-29 10:49:29

标签: javascript angularjs date timezone

我有这段代码:

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设置其TZ。我该怎么办?

然后我想使用getTimezoneOffset()

1 个答案:

答案 0 :(得分:2)

如果时区字符串是有效的IANA timezone identifier且支持Intl object,则可以将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,并观察到了20世纪70年代的夏令时。

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

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