我正在经历一个令人沮丧的问题,我一直在努力工作。长话短说,如果有人在纽约创建一个2Pm的活动,我希望那个活动在欧洲观看日历的人显示为8Pm(他们提前6个小时)。
我的完整日历配置看起来像这样:
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
}
我有更多的选择,但这些应该足以满足这个问题的目的。正如文档中所提到的,fullcalendar通过GET传递URL,如下所示:
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"}]
一切似乎都是正确的,但无论我尝试过什么,事件都显示为2PM。
注意这很重要,我还没有提到这一点,但我将我选择的时区传递给renderSchedule
函数。所以,即使我位于美国东海岸,我希望能够通过欧洲时区并相应地提供日历。
另外,我应该指出我正在使用beta版本(2.0),它允许传递时区字符串(我正在做)并通过moment.js使用时刻
知道我在这里做错了吗?
答案 0 :(得分: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
}
});
如果您使用的是beta版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;