Важная информация о Javascript заключается в том, что все ссылки на часовые пояса относятся к часовому поясу системы, в которой выполняется код, из которых у вас нет контроля. Вы даже не можете доверять клиентской машине, чтобы установить правильный часовой пояс. Поэтому, когда вы выбираете опцию для отображения часового пояса, все, что можно сделать, - это часовой пояс клиента.
Временные интервалы в JavaScript могут усложниться, вот blog post, который идет довольно подробно и предоставляет решения.
Один простой способ обработки часовых поясов - сохранить все мои даты в 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(), если эта строка называется преобразование будет происходить, если не в настоящее время нет изменение будет сделано. Метод clone() - лучший способ предотвратить побочные эффекты, а затем использовать угловую.копию, как и раньше.
Теперь вот новый формат фильтр, похожий на перед:
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);
}
};
});
В общем, момент библиотеке часовых поясов весьма полезно!
Спасибо, это отлично! Не могли бы вы сказать, что можно также, например, передать «Европа/Дублин» в смещение, а затем рассчитать смещение для этого значения так же, как и в выборе часового пояса? –
Ответ да, это возможно, если вы используете time.JS часовую библиотеку. См. Мой обновленный ответ для новых фильтров и новую демонстрацию. – Graham
Спасибо! Это выглядит великолепно! –