我有这段代码:
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()
答案 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时区数据库可以免费使用。
偏移量只是本地时间(无论确定)与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日,即使这是他们出生时纽约的约会。