fullCalendar夏令时错误

时间:2012-03-08 20:27:33

标签: php date fullcalendar strtotime

我有一个使用基于jQuery的fullCalendar构建的应用程序  http://arshaw.com/fullcalendar/

我的日历事件由输出JSON的Ajax调用加载,它被配置为将星期一作为一周的第一天,默认视图为星期。

它一直很好,但我注意到如果我前往第13周(3月26日开始),事件没有正确加载。我马上想到这必须与3月25日发生的夏令时变化有关。

当我使用点击下一个/上一个按钮时,日历使用自动生成的开始和结束时间进行ajax调用,我在后台的PHP脚本需要开始日期计算周数并调用我的数据库中的所有事件那个星期。

例如,在第12周,传递以下变量:

  ?

开始= 1332115200&安培;端= 1332716400&安培; _ = 1331237729591

PHP脚本:

$week_no = date('W', $_GET['start']);

第12周就可以了。

然而,接下来一周传递的变量是:

  ?

开始= 1332716400&安培;端= 1333321200&安培; _ = 1331238038820

$week_no = date('W',$_GET['start']); == 12 // same as last week

Nn进一步检查

echo date("C",1332115200);    // == 2012-03-19T00:00:00+00:00
echo date("C",1332716400);    //2012-03-25T23:00:00+00:00 (1 hour short of being in week 13)

所以很明显,日光变化导致了这个问题。

我的问题是,这是关于fullcalander还是我的PHP逻辑的问题?

3 个答案:

答案 0 :(得分:3)

首先:我不知道你的代码和你的设置,所以我所说的只是一个猜测。

如果您的系统都设置为UTC,则不会(不应该)成为问题。对于将服务器设置为UTC的JavaScript函数date.getUTC *(fullCalendar不使用那些)的正确用法也是如此。但我认为只有你的服务器实际设置为UTC,而你的计算机设置为“欧洲/伦敦”或类似的东西(现在看起来像UTC,因为它在冬天是UTC + 0)。

所有这些都导致以下情况:fullCalendar尝试计算时间戳,例如: 2012年7月1日00:00:00 - 因为计算机被设置为一个时区,在该日期适用DST(冬天UTC + 0,夏天UTC + 1 - > 7月1日= UTC + 1)你将获得7月1日00:00:00 IN LONDON 的那个时刻的时间戳。因为他们的时间是在UTC之前的一小时,如果您解释相对于UTC的时间戳,那么您将得到23:00:00 - 也就是服务器所做的事情。

解决方案可以就像这样简单:

<?php
date_default_timezone_set('Europe/London');

这样,服务器应该解释相对于UTC + 0的时间戳,如果相应的日期是冬天,相对于UTC + 1,如果它是在夏天。

但是,如果访问者时区设置为不同的,例如“America / Los_Angeles”,您的应用程序仍然搞砸了,无法按预期工作。最好的方法通常是在任何地方使用UTC时间戳,但fullCalendar当前不支持。

答案 1 :(得分:0)

可能取决于时区,因为夏令时在不同时区的日期不同。确保php.ini文件中设置的时区与您所在国家/地区的时区相同。

使用date_default_timezone_set功能也可以设置时区。

以下是支持的时区列表 http://php.net/manual/en/timezones.php

答案 2 :(得分:0)