我正在开发一个日历应用程序。在这个应用程序中,来自不同时区的用户可以创建/查看事件。我想按照下面的方法来保存UTC中的事件时间,并以用户的本地时间显示它们。注意:用户具有其首选时区设置。
保存事件开始时间为UTC时间戳:
$timezone = new DateTimeZone( $user_timezone_name );
$utcOffset = $timezone->getOffset( new DateTime( $event_start_time_string_local ) );
$event_start_timestamp_local = maketime( $event_start_time_string_local );
//Now add/subtract $utcOffset to/from $event_start_timestamp_local to get event's start //time timestamp in UTC and save this result in DB.
获取用户所在时区的事件开始时间:
date_default_timezone_set( $user_timezone_name );
$eventTimeLocalTime = date("Y-m-d H:i:s", $event_start_timestamp_in_UTC );
其中:
user_timezone_name is user's timezone setting.
event_start_time_string_local is event's start time string in local/civil time.
event_start_timestamp_in_UTC is event's start time timestamp in UTC.
我的问题:
- 上面使用的PHP API是否考虑了所有地区的DST?
- DST时间本身在不同的年份会发生变化,PHP如何获得有关信息?我们需要升级PHP吗?如果是这样,我们需要升级所有或特定的PHP库吗?
参考:-does-phps-date-default-timezone-set-adjust-to-daylight-saving-get-timezone-offset-for-a-given-location
2条答案
按热度按时间tquggr8v1#
你把这个问题弄得太复杂了。要使用
DateTime
在两个时区之间转换,请执行以下操作:这将从用户的本地时区转换为UTC。要以用户的本地时间显示时间,请交换两个时区。
是的,PHP负责DST。必要的转换规则是PHP安装的一部分。您可以通过更新PHP或更新timezonedb来保持最新。
j5fpnvbx2#
是的,php API考虑到了夏令时。大多数时候,你可以安全地执行时间转换的方式deceze已经显示。问题是,它并不总是可能/可行或有意义的。考虑下面的例子-在波兰(2013年)10月27日凌晨3点,你的时钟被向后移动一小时切换到标准时间(偏移UTC+01:00)3月31日凌晨2点,时钟被向前调整一小时切换到夏令时(偏移UTC+02:00)。现在让我们看看“真实的”如何在Grenwich/UTC中滴答作响,以及PHP如何从欧洲/华沙转换到UTC工作:
正如你所看到的,在凌晨2点到3点之间,PHP不可能知道“哪个”小时(从调整前/调整后),因此不能可靠地转换。- )