Moment.js И текущий часовой пояс с временными поясами атрибутов данных

#javascript #jquery #time #timezone #momentjs

#javascript #jquery #время #Часовой пояс #momentjs

Вопрос:

У меня есть сгенерированный сервером список местоположений в country/city формате, т.е.

 <span class="location" data-timeZoneID="China/Beijing">Beijing</span>
<span class="location" data-timeZoneID="England/London">London</span>
  

Я бы хотел использовать JS / Jquery и моментальный часовой пояс для этого:

  1. Извлеките data-timezone- атрибут из каждого элемента
  2. Предоставьте его экземпляру moment.tz() ,
  3. И добавьте элемент с результатом, таким образом отображая время в любых перечисленных местах.

РЕДАКТИРОВАТЬ: я успешно извлекаю значения атрибутов данных с помощью jQuery, но когда я пытаюсь передать их moment().tz() ; время не преобразуется, и вместо этого отображается время моего локального клиента. Когда я вручную ввожу идентификатор часового пояса IANA, происходит преобразование (хотя оно по-прежнему неточно). Любые мысли о том, почему значение, предоставленное из data-attribute , не будет работать?

Это (вроде) работает:

 $(function(){
    $('.location').each(function() {
        var timeZone = $(this).data('timezoneid');
        var now = moment().tz('Africa/Tripoli').format("MM/DD/YYYY hh:mm");
        $(this).append( now );
    });
});
  

Этого не происходит (отображается местное время):

HTML

 <span class="location" data-timeZoneID="Africa/Tripoli">Tripoli: </span><br />
<span class="location" data-timeZoneID="England/London">London: </span>
  

JS

 $(function(){
    $('.location').each(function() {
        var timeZone = $(this).data('timezoneid');
        var now = moment().tz("'"   timeZone   "'").format("MM/DD/YYYY hh:mm");
        $(this).append( now );
    });
});
  

jsFiddle

Ссылка

Ответ №1:

Вот JSFiddle, который работает

http://jsfiddle.net/93pEd/1/

Обратите внимание на 2 изменения, которые я внес:

  - London is Europe/London instead of England/London
 - the format is HH:mm instead of HH:MM
  

Комментарии:

1. Вау. Я просмотрел код, вероятно, 50 раз, перечитал документацию, попытался изменить каждую строку… большое спасибо за помощь!

Ответ №2:

Было немного сложно понять, в чем ваша проблема, но, учитывая ваш «пошаговый» список, я бы сделал следующее:

 $(function(){
    $('.location').each(function() {
        var timeZone = $(this).data('timeZoneID');
        var now = moment().tz(timeZone).format('HH:MM');
        $(this).append( now );
    });
});
  

ДЕМОНСТРАЦИЯ

Комментарии:

1. спасибо за ваш ответ — когда я запускаю код, timeZone переменная, похоже, возвращает значение undefined — вы можете увидеть его здесь: jsfiddle.net/gLNXd/41

2. Я не могу использовать эту скрипку, поскольку требуется аутентификация, однако я понял, что неправильно использую moment, это должно быть что-то вроде этого (вызов функции в moment): jsfiddle.net/hypzo/gLNXd/43

3. Я выяснил, что проблема с атрибутом undefined данных заключалась в использовании символов верхнего регистра, что заставляет jQuery интерпретировать строку как несколько data-attribute символов. Теперь он отображает время, но это просто мое местное время.