PHP Daylight节省难题

tra*_*ain 8 php datetime dst

我有一个关于处理夏令时的一般问题.我猜它不是特定于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');
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

小智 2

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

\n\n

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

\n\n

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

\n\n
    \n
  • 当他们节省时间时,找到当前日期之前的第一个转换,该日期不是DST。(通常是过去一年的两个值之一)。使用非 DST时段的偏移量进行转换
  • \n
  • 检索值时,如果您当前处于 DST 时段,请使用非 DST 时段的偏移量(而不是当前偏移量)来转换时间。
  • \n
\n\n

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

\n\n

当拉回该值时,如果他们在一月份查看该值,则添加 5,如果您在 8 月查看该值,则添加 4。

\n\n

这适用于 95% 的情况,我假设开关是一致的。如果 Eastern 决定与 Central 合并,则可以运行 \xe2\x80\x935/\xe2\x80\x934/\xe2\x80\x935/\xe2\x80\x934/\xe2\x80\x935/ \xe2\x80\x935/ \ xe2\x80\x935/\xe2\x80\x936/\xe2\x80\x935/\xe2\x80\x936/\xe2\x80\x936这会让事情变得混乱。

\n\n

这个问题没有灵丹妙药。我不知道您的应用程序结构的详细信息,您可能只需要尝试在任意一天的午夜添加 3 小时,以便任何重复的每日约会仅存储为时间

\n