關於Javascript的重要知識是,所有對時區的引用指的是系統中執行代碼的時區,其中您無法控制。你甚至不能相信客戶端機器設置了正確的時區。所以當你選擇一個顯示時區的選項時,所有可以完成的事情都是給你客戶端的時區。
JavaScript中的時區可能會變得很複雜,這裏有一個,它有相當多的細節並提供解決方案。
處理時區的一種簡單方法是將所有日期存儲在UTC中,然後使用moment.JS庫格式化它們以顯示它們。假設您的所有時間都以UTC格式存儲,則可以使用類似this plunker中所寫的過濾器來格式化日期並將其操作爲用戶首選的時區。這裏只是樣品過濾件代碼:
// filter to set the timezone, assumes incoming time is in UTC
angular
.module('plunker')
.filter('toUserTimezone', function() {
return function(input, format, offset) {
var output, timezoneText, inputCopy;
// we need to copy the object so we don't cause any side-effects
inputCopy = angular.copy(input);
// check to make sure a moment object was passed
if (!moment.isMoment(inputCopy)) {
// do nothing
return input;
} else {
// set default offset change to 0
offset = offset || 0;
// change the time by the offet
inputCopy.add(offset, 'hours');
// this will need to be improved so the added text is in the format +hh:mm
offset >= 0 ? timezoneText = '+' + offset : timezoneText = offset;
// format the output to the requested format and add the timezone
output = inputCopy.format(format) + ' ' + timezoneText;
return output;
}
};
});
的那一刻庫是相當不錯的,只要我有日期的工作,我會包含它,因爲它是小的。它也有一些非常強大的時區工具。您可以使用時區工具擴展上面的過濾器,以使其與DST以及偏移量不等於一小時的時區(如印度)一起工作。
更新: 在看了時區庫之後,我們實際上可以簡化過濾器代碼。第一個解決方案更多的是破解,這個解決方案更加強大,因爲我們將保留原始時區數據。另外,我已將格式和時區轉換爲兩個單獨的過濾器。您可以在this plunker中看到演示。
這裏是轉換時區的過濾器:
angular
.module('plunker')
.filter('convertTimezone', function() {
return function(input, timezone) {
var output;
// use clone to prevent side-effects
output = input.clone().tz(timezone);
// if the timezone was not valid, moment will not do anything, you may
// want this to log if there was an issue
if (moment.isMoment(output)) {
return output;
} else {
// log error...
return input;
}
};
});
的時區庫允許您將字符串傳遞到moment.tz()方法,如果該字符串被稱爲轉換會發生,如果不是無將作出更改。克隆()方法是防止使用angular.copy的副作用的一種更好的方法,就像我以前那樣。
現在,這裏是新的格式,濾鏡,與前:
angular
.module('plunker')
.filter('formatTime', function() {
return function(input, format) {
// check to make sure a moment object was passed
if (!moment.isMoment(input)) {
// do nothing
return input;
} else {
return input.format(format);
}
};
});
綜上所述,當下時區圖書館是非常有用的!
謝謝,這看起來不錯!你是否可以說例如在偏移量中傳遞「歐洲/都柏林」,然後像在時區選擇中一樣計算該值的偏移量? –
答案是可以的,如果你使用moment.JS時區庫。查看我更新的新過濾器和新演示的答案。 – Graham
謝謝!它看起來非常棒! –