FullCalendar时区不会修改客户端的时间

时间:2014-02-06 05:32:23

标签: javascript php fullcalendar

我正在经历一个令人沮丧的问题,我一直在努力工作。长话短说,如果有人在纽约创建一个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使用时刻

知道我在这里做错了吗?

1 个答案:

答案 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;
相关问题