【问题标题】:FullCalendar timezones not modifying times on client's endFullCalendar 时区不修改客户端的时间
【发布时间】:2014-02-07 09:41:27
【问题描述】:

我遇到了一个令人沮丧的问题,我整晚都在努力解决这个问题。长话短说,如果纽约的某个人在下午 2 点创建了一个活动,我希望该活动显示为晚上 8 点,以供查看欧洲日历的人使用(假设他们提前了六个小时)。

我的完整日历配置如下所示:

  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"}]

一切似乎都是正确的,但无论我尝试了什么,事件都显示为下午 2 点。

注意这很重要,我还没有提到这一点,但我正在将我选择的时区传递给renderSchedule 函数。因此,即使我位于美国东海岸,我也希望能够通过欧洲时区并相应地渲染日历。

另外,我应该指出,我使用的是测试版 (2.0),它允许传递时区字符串(我正在这样做)并通过 moment.js 使用时刻

知道我在这里做错了什么吗?

【问题讨论】:

    标签: javascript php fullcalendar


    【解决方案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;
    

    【讨论】:

    • 我正在使用支持时区并使用 momement.js 的 beta 版本
    • 在这种情况下,ignoreTimezone 默认设置为 false,您的时区参数应该是“timezoneParam”与“timezone”。你看过arshaw.com/fullcalendar/docs2/timezone/timezone的demo吗?
    • 我认为您不能更改 ignoreTimezone 的值,因为它在 2.0 中不存在。看看arshaw.com/fullcalendar/wiki/Upgrading-to-2
    • 您好,感谢您的所有跟进,非常感谢。我确实看过那个演示,但是在那个演示中他们使用了“时区”参数,你还是建议我把它改成timezoneParam 吗?
    • 我只是仔细检查了文档,并且 timezoneParam 仅在事件中指定。时区参数应该可以工作。您是否尝试在偏移量中添加“:”?
    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 2023-03-24
    • 1970-01-01
    • 2015-07-10
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多