微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP Daylight节省难题

我有一个关于处理夏令时的一般问题.我猜它不是特定于 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点(不管夏令时).

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

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

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

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

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

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

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

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

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

原文地址:https://www.jb51.cc/php/134289.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐