2012-03-08 120 views
4

我有一个与基于jQuery的构建的应用程序fullCalendar http://arshaw.com/fullcalendar/fullCalendar夏令时错误

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

它一直正常工作,但我注意到,如果我前进到第13周(从3月26日开始),事件无法正确加载。我马上就想到了这一点,这与夏季时间变化发生在3月25日的事情有关。

当我使用点击next/prev按钮时,日历会使用自动生成的开始和结束时间进行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逻辑的问题?

+0

什么时区是a)您的计算机b)服务器/ php设置为?如果有差异,那肯定会造成错误。不一定是这个,但将来会有错误/问题。由于fullCalendar取决于客户端的时钟,因此您无法做太多的工作。 – Niko 2012-03-08 22:26:51

+0

哦真的吗?这很糟糕。应该有可能编写可以随时在任何时区工作的代码。我有点认为这是一个unix时间戳点.. – 2012-03-09 01:27:34

+0

是的,但你需要做的权利。 fullCalendar不会传递UTC时间戳,而是本地化的。这就是搞砸了。 – Niko 2012-03-09 10:21:00

回答

3

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

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

以上情况都会导致以下情况:fullCalendar会尝试计算例如以下情况的时间戳: 2012年7月1日00:00:00 - 因为计算机设置为当天应用DST的时区(UTC为冬季,UTC为夏季 - > 7月1日= UTC + 1),您将7月1日00:00:00在伦敦上获得该时刻的时间戳。因为他们的时间在UTC前一小时,所以如果您解释相对于UTC的时间戳,那么您将获得23:00:00 - 即服务器执行的操作。

溶液可以是如此简单:

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

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

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

+0

感谢您的输入。在过去的几天里一直在研究这个问题,我得出了很多相同的结论。我不得不说,处理时区和夏令时是非常令人沮丧的。现在我的应用程序在我的房子里工作,但是时间和地理的本质表明,它在任何时候都会破坏! – 2012-03-10 13:03:51

+0

这就是我对此的100%认知。坚持UTC是最好的,只要这是可能的。 – Niko 2012-03-10 14:33:19

+1

其实,阅读更多一点,fullCalendar(1.5+)确实支持UTC,在日期参数末尾使用'Z'。例如2012-03-11T12:00:00.0000000Z读取为UTC。尽管如此,UTC被认为是一个时区,因此ignoreTimezone需要设置为false。 http://code.google.com/p/fullcalendar/issues/detail?id=750 – 2012-03-10 15:06:52