2015-06-13 4 views
2

Я боролся с этим какое-то время, поэтому, обратившись за помощью, пожалуйста.Полный календарь Timezone Moment js Issue

У меня есть приложение с несколькими часовыми поясами в реальном времени, которое использует Signal R, все datetime хранятся и передаются с использованием UTC, и я хочу управлять ими на стороне клиента, чтобы избежать нескольких трансляций для разных пользователей, если одна встреча обновляется.

Я пытаюсь получить fullcalendar, чтобы отображать даты в соответствующем часовом поясе для пользователя, а не на основе браузера, а локальная строка, которая хранится при входе пользователя в систему.

это даже возможно? или мне нужно хранить смещения и делать это таким образом (я надеялся избежать этого). Я использовал eventRender для манипулирования, но это дает мне другие проблемы и вызывает ошибку.

Мой код:

$(document).ready(function() { 



    function renderCalendar() { 
     $('#calendar').fullCalendar({ 
      header: { 
       left: 'prev,next today', 
       center: 'title', 
       right: 'month,agendaWeek,agendaDay' 
      }, 
      editable: true, 
      timezone: "Europe/Istanbul", 
      eventLimit: true, // allow "more" link when too many events 
      events: [{"id":1026,"taskTypeId":4,"title":"(New Appointment)","start":"2015-06-11T11:00:00Z","end":"2015-06-11T12:00:00Z", "timezone":"UTC","allDay":false,"url":null,"location":"","people":null,"className":"event-appointment"}], 
      eventRender: function(event, el) { 


       if (event.start.hasZone()) { 
        el.find('.fc-title').after(
        $('<div class="tzo"/>').text(event.start.format('Z')) 
        ); 
       } 

      } 
     }); 
    } 

    renderCalendar(); 

}); 

ответ

4

FullCalendar's time zone documentation объясняет, что названные временные зоны, как ожидается, должны быть рассчитаны на сервере. Хотя он поддерживает тегирование событий с часовым поясом, он не делает никакого преобразования часового пояса на стороне клиента. Если это поведение не изменится в будущей версии, оно не соответствует описанному вами сценарию.

Однако это не значит, что вы застряли. FullCalendar принимает зависимость от moment.js, и есть дополнение для moment.js, называемое moment-timezone. Он специально разработан для выполнения клиентских часовых поясов с использованием идентификаторов часовых поясов IANA, таких как "Europe/Istanbul, которые вы показываете в своем примере.

Когда вы получаете свое событие из трансляции SignalR, вы можете использовать момент времени для преобразования из UTC в нужной зоне перед отправкой результата в объект события FullCalendar

var s = moment("2015-06-11T11:00:00Z").tz("Europe/Istanbul").format(); 
// result: "2015-06-11T14:00:00+03:00" 

пара дополнительных точек:.

  • Время изменения данных зоны периодически, как правительства мира меняют свое мнение о правилах их смещения и летнего времени. Оставайтесь на вершине обновлений, подписавшись на IANA Time Zone Announcements mailing list. Разумно ожидать обновления от любой библиотеки часовых поясов в течение недели или около того релиза IANA.

  • Поскольку вы используете SignalR, я предполагаю, что ваш задний конец должен быть .NET. Документация FullCalendar показывает использование PHP в качестве задней части, которая уже поддерживает часовые пояса IANA. Однако в .NET вы можете использовать Noda Time для получения той же функциональности.

+0

Благодаря Matt, я использовал момент часовой пояс на первую попытку решить это с помощью eventRender, который, к сожалению, показывает время в UTC пока вы не измените вид один раз (я уже поднял это как потенциальный баг с Адамом Шоу) , Сегодня я перевел свой Кодекс в Ноду, и это был последний кусок головоломки. Я думаю, что мне придется манипулировать датами, прежде чем полный календарь получит либо клиентскую сторону, либо рассмотрит возможность отправки нескольких трансляций. Этот ответ дает мне еще один вопрос с проблемой, с которой я столкнулся при этом. я буду подниматься отдельно после того, как это повлияло на это. – JGuymer

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