显然,跳到英国夏令时(夏令时)是编程界的一大困惑,而我确实陷入了这种困惑。
使用时区敏感系统时,我能找到的最佳解决方案(我将尝试连贯地解释)是这样的:
- Web 服务器和数据库都应该在同一个机器时区运行。我建议使用 UTC,因为它是时区转换的基石。这将确保存储在数据库中的所有日期都是不变的,并且不会跳过任何时间,例如夏令时之间的 1 小时跳跃。
- 在所有 PHP 脚本的顶部使用
date_default_timezone_set('Europe/London'); 和用户的特定时区。
从用户提交的表单生成日期时,使用gmmktime(); 确保创建的时间戳是UTC,并且不会被您设置的时区更改。
-
date(); 可以在显示日期时使用,因为这会将时间戳转换为考虑到您设置的时区的正确时间。
如果您确实需要以 UTC 格式显示日期,请使用 gmdate(); 和您从数据库中获取或使用 gmmktime(); 创建的 $gm_timestamp。
我写了一点 PHP 来帮助理解这种情况。
date_default_timezone_set('UTC');
$gmtime = gmmktime(2,0,0,03,29,2009);
$time = mktime(2,0,0,03,29,2009);
echo $gmtime.'<br />'.date('r',$gmtime).'<br />'.gmdate('r',$gmtime).'<br />';
echo $time.'<br />'.date('r',$time).'<br />'.gmdate('r',$time).'<br />';
date_default_timezone_set('Europe/London');
$gmtime = gmmktime(2,0,0,03,29,2009);
$time = mktime(2,0,0,03,29,2009);
echo $gmtime.'<br />'.date('r',$gmtime).'<br />'.gmdate('r',$gmtime).'<br />';
echo $time.'<br />'.date('r',$time).'<br />'.gmdate('r',$time).'<br />';
希望我做得很好,但我对此表示怀疑,因为我仍在努力解决脑海中的问题。
更新:
很高兴我这样做了,因为我现在怀疑用户输入的日期。
要让用户输入的日期(考虑到他们的时区)与数据库中的 UTC 对应日期相匹配,您应该将其输入mktime()。然后使用gmdate('U', $timestamp); 获取真正的UTC 时间戳。 (我认为)
示例
从报告方面来看,用户使用的是“欧洲/伦敦”时区。在 PHP 脚本的开头,我们调用 date_default_timezone_set('Europe/London');,而数据库(以及其中的所有记录)仍采用 UTC。
然后,用户发送消息,表示他们希望选择在 2010 年 3 月 25 日 10:00 到 2010 年 3 月 30 日 14:00 之间添加到数据库的书籍列表。然后 PHP 脚本通过 mktime($hour, $minute, $second, $month, $day, $year) 运行日期变量以生成正确的 UTC 时间戳。开始日期不会改变,但 PHP 知道结束日期在 BST 时区内,因此将时间戳相应地更改为 UTC。
当结果返回给用户时,date('r', $date_added) 可用于根据用户设置的时区向用户显示图书添加到数据库的日期。
此链接可能有助于了解何时更改。 http://www.daylightsavingtime.co.uk/