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
. Поэтому, хотя я и нахожусь на восточном побережье США,я хотел бы иметь возможность пройти в Европейском часовом поясе и иметь соответствующий календарь.
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;