FullCalendar часовые пояса без изменения времени на стороне клиента


Я переживаю неприятную проблему, над которой я работал всю ночь. Короче говоря, если кто-то в Нью-Йорке создает событие в 2 часа дня, я бы хотел, чтобы это событие было показано как 8 вечера для кого-то, кто просматривает календарь в Европе (скажем, они опережают на шесть часов).

Мои конфигурации fullcalendar выглядят следующим образом:

  function renderSchedule(timezone) {
     var userSchedule = $('#user-schedule').fullCalendar({
             header: {
                 left: 'prev,next today',
                 center: 'title',
                 right: 'month,agendaWeek,agendaDay'
             },
             timezone: timezone,
             ignoreTimezone: false,
             events: baseurl + "load_schedule",
             editable: true,
             defaultView: 'agendaWeek',
             firstHour: 8,
             allDayDefault: false
         }

У меня есть больше вариантов, но их должно быть достаточно для этой цели. question.As упомянутый в документах, fullcalendar передает URL-адрес через GET, который выглядит следующим образом это:

         mysite.com / my_page / load_schedule ? start = 2014 - 02 - 02 & end = 2014 - 02 - 09 & timezone = Europe % 2FChisinau & _ = 1391660233815 

Затем, на бэкэнде я делаю следующее, чтобы преобразовать из MYSQL datetime вISO8601

$start = ($event['start']); 
$end = ($event['end']); 
$dateStart = new DateTime($start, new DateTimeZone($timezone)); 
$dateEnd = new DateTime($end, new DateTimeZone($timezone)); 
$dateStart - > setTimezone(new DateTimeZone($timezone)); 
$dateEnd - > setTimezone(new DateTimeZone($timezone)); 
$event['start'] = $dateStart - > format(DateTime::ISO8601); 
$event['end'] = $dateEnd - > format(DateTime::ISO8601); 
$newResult[] = $event;

Переменная $timezone содержит Europe/Chisinau, которая, конечно же, была передана самим fullcalendar.

Вот что вышеприведенное возвращает обратно к fullcalendar:

[{"id":"5","start":"2014-02-06T14:10:00+0200","end":"2014-02-06T15:00:00+0200","title":"My title"}]

Все кажется правильным, но независимо от того, что я пробовал, события показывают как 2 часа дня.

Примечание это важно, я еще не упоминал об этом, но я прохожу в часовом поясе по своему выбору к функции renderSchedule. Поэтому, хотя я и нахожусь на восточном побережье США,я хотел бы иметь возможность пройти в Европейском часовом поясе и иметь соответствующий календарь.

Кроме того, я должен отметить, что я использую бета-версию (2.0), которая позволяет передавать строку часового пояса (что я и делаю) и использует моменты через момент.js Есть идеи, что я здесь делаю не так?
1 2

1 ответ:

Я смог заставить его работать с демо. Я обновил ваш формат даты, чтобы включить двоеточия для смещения. Кроме того, последняя стабильная версия fullcalendar 1.6.4 не имеет переменной часового пояса.

$('#calendar').fullCalendar({
        editable: true,
        header : {
            left:"prev,next",
            center:"title",
            right:"month,basicWeek,agendaWeek,basicDay,agendaDay"
            },
        ignoreTimezone: false,
        events: [
        {
            start: "2014-02-06T14:10:00+02:00",
            end:"2014-02-06T15:00:00+02:00",
            title:"My title",
            allDay: false
        }
});

Если вы используете бета-версию 2.0, то вам нужно удалить ignoreTimezone, поскольку это больше не параметр.

Обновленный Ответ:

Оказывается, проблема заключалась в том, как даты обрабатывались на бэкэнде. Вот как я решил эту проблему.

date_default_timezone_set($timezone);
            $timestampStart = strtotime($mysql_start_date);
            $timestampEnd = strtotime($mysql_end_date);
            $local_time_start = $timestampStart + date('Z');
            $local_time_end = $timestampEnd + date('Z');
            $local_date_start = date('Y-m-d H:i:s', $local_time_start);
            $local_date_end = date('Y-m-d H:i:s', $local_time_end);

            $event['start'] = $local_date_start;
            $event['end'] = $local_date_end;