2015-05-07 5 views
1

Я могу правильно отобразить выбранную временную метку по местному времени для этой метки времени, просто используя date:'medium'.Angularjs отображает дату метки времени в разных часовых поясах

То, что я хочу достичь, показывает эту временную метку в определенном часовом поясе, например UTC + 03: 00 или GMT + 03: 00, чтобы привести пример.

Я пытался использовать

  • дата: 'среды': 'UTC + 03: 00'
  • дата: 'средний': 'UTC + 0300' Дата
  • :» средний ':' GMT + 03: 00'
  • дата: 'средний': 'GMT + 0300'
  • дата: 'средний': '+ 3:00'
  • дата: 'средний': '+ 0300 '

Ничто из этого не изменило время временной отметки времени, которое было бы в этот часовой пояс.

Причина: отображение времени, необходимого для настройки часового пояса пользователя, даже если они в настоящее время находятся в стране с другим часовым поясом.

Кто-нибудь знает, как я могу правильно отображать временную метку в указанный часовой пояс?

ответ

1

Важная информация о 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); 
     } 
    }; 
    }); 

В общем, момент библиотеке часовых поясов весьма полезно!

+0

Спасибо, это отлично! Не могли бы вы сказать, что можно также, например, передать «Европа/Дублин» в смещение, а затем рассчитать смещение для этого значения так же, как и в выборе часового пояса? –

+0

Ответ да, это возможно, если вы используете time.JS часовую библиотеку. См. Мой обновленный ответ для новых фильтров и новую демонстрацию. – Graham

+0

Спасибо! Это выглядит великолепно! –

0

В соответствии с угловым Документах:

Временные зоны

Угловой DateTime фильтр использует параметры часового пояса браузера. В этом же приложении будет отображаться различная информация о времени в зависимости от настроек часового пояса компьютера, на которых запущено приложение . В настоящее время ни JavaScript, ни Angular не поддерживают отображение даты с часовым поясом, указанным разработчиком .

Принимала вы посмотрите на momentjs и/или angular-moment?

+0

Я просмотрел https://docs.angularjs.org/api/ng/filter/date и там говорится, что вы можете выбрать часовой пояс. Нет, я еще не смотрел на моменты и/или угловой момент, но я это сделаю. –

Смежные вопросы