首页 文章

PHP Daylight节省难题

提问于
浏览
8

我有一个关于处理夏令时的一般问题 . 我猜它不是特定于PHP的,但我用PHP编写,所以我认为包含它不会有什么坏处 .

我有一个使用jquery fullcalendar构建的日历应用程序 . 用户在本地时区查看事件,我的服务器将它们存储为mysql中的UTC日期时间 . (有关stackoverflow的其他问题表明这是处理时区的最佳方法 . )因此,每次用户在日历上保存或查看事件时都会进行转换 . 这工作正常,但我很困惑如何最好地处理夏令时 .

例如,假设时区EST(东部标准时间)的用户创建一个事件,当它不是夏令时,每天下午3点重复 . 我的PHP代码使用标准的DateTime(和DateTimeZone)类在UTC和EST之间转换UTC-5:00 . 当夏令时处于活动状态时,时钟将提前一小时,PHP将在UTC和EST之间转换UTC-4:00 . 从用户的角度来看,事件从原来的下午3点转移到下午4点 . 这不是我的用户和我想要的 . 无论夏令时如何,下午3点的活动都应该在下午3点举行 . 处理这个问题的最佳方法是什么? PHP中有没有办法忽略夏令时?

我的代码:

$getDate = new DateTime($storedDate, new DateTimeZone('UTC'));
$getDate->setTimezone(new DateTimeZone('America/New_York'));
$getDateString = $getDate->format('Y-m-d H:i:s');

更多信息:(从我下面的评论中复制)

  • 仅存储重复事件的第一次出现 . 根据用户请求的日历视图(月,周或日视图)动态创建所有其他事件 . 通过我编码的方式,它只创建在视图上可见的事件 .

  • 问题是,我还需要为其他时区保持不变 . 继续原始示例,下午3点应该在美国东部时间下午3点(不管夏令时),但如果在中部时间观看事件,该事件也应该在下午2点(不管夏令时) .

从本质上讲,我需要以某种方式忽略夏令时 .

2 回答

  • 2

    您是否尝试过查看DateTimeZone :: getTransitions()?

    http://www.php.net/manual/en/datetimezone.gettransitions.php

    特别是使用[offset]和[isdst]属性 .

    • 当他们节省时间时,找到当前日期之前的第一个转换 NOT DST . (通常是过去一年中两个值中的一个) . 使用 non-DST 期间的偏移量进行转换

    • 检索该值时,您当前使用非DST周期的偏移量来转换时间,而不是当前偏移量 .

    以EST为例,即使您在EDT,也可以在8月使用EST转换为-5来保存值 .

    如果他们在1月份查看该值时将值拉回,则添加5,如果您在8月份,则添加4 .

    这将适用于95%的情况我假设交换机是一致的 . 如果东方决定与Central合并,你可能会有-5 / -4 / -5 / -4 / -5 / –5/–6/–5/–6/–6 的转换,这会搞砸 .

    有了解您的应用程序结构的详细信息,您可能只需要尝试将3个小时添加到您所在的任何一天的午夜,以便任何定期的每日约会存储为 time only .

  • 2

    这是一个复杂的问题 . 我已经学到了很难,不是每天都是86,400秒 .

    在处理各种日历应用程序时,我在早期做出了一个设计决定,这给我带来了很多麻烦 . 也就是说,事件的每个实例都在数据库中有一个条目 .

    一张表用于所有事件信息( Headers ,描述等) . 另一个表为该事件的每个实例保存了一个时间戳 . 当有人安排重复事件(比如每周三下午3:00)时,我会在每周三下午3:00 in their timezone (实际上存储为UTC)插入一个实例 . 现在,理论上的事件可以永远重复 . 我认为在重复上设置一个合理的限制(例如50或100年)要比在飞行中计算事件的所有日期要简单得多 . 对于用户来说,事件似乎永远持续下去,但在数据库中,它在一个非常狭窄的表中只有36,500条记录 .

    使用这种方法,您必须考虑例外 . 有时人们会改变一个事件实例的细节 . 在这些情况下,我只是创建了另一个事件并复制了相关的细节...因为它实际上是一个单独的事件 . 如果你想将它们与组ID绑在一起,你可以 . 更改事件的单个调度很容易,因为有一个单独的行每个实例 .

    对于像这样的大多数情况,我推荐这种方法 . 它为我节省了很多麻烦,能够依靠数据库完成所有繁重的工作,同时也解决了你的时区问题 .

相关问题