timezone with DST handling by PHP
我正在处理一个日历应用程序。来自不同时区的用户在此创建/查看事件。我想按照下面的方法以UTC格式保存事件时间,并以用户的本地时间显示。注意:用户有他们喜欢的时区设置。
要将事件开始时间保存为UTC时间戳:
1 2 3 4 | $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. |
要获取用户时区中的事件开始时间:
1 2 | date_default_timezone_set( $user_timezone_name ); $eventTimeLocalTime = date("Y-m-d H:i:s", $event_start_timestamp_in_UTC ); |
在哪里?
1 2 3 |
我的问题:
- 上面使用的PHP API是否为所有区域处理DST?
- DST时间本身会在不同的年份发生变化,PHP如何获取有关这方面的信息?我们需要升级php吗?如果需要,我们需要升级所有或特定的PHP库吗?
参考文献:-PHPS日期默认时区设置是否调整为夏令时?-给定位置的get-timezone-offset
你太过分了。要使用
1 2 3 4 5 | date_default_timezone_set('Asia/Kolkata'); // YOUR timezone, of the server $date = new DateTime($input, new DateTimeZone('Asia/Tokyo')); // USER's timezone $date->setTimezone(new DateTimeZone('UTC')); echo $date->format('Y-m-d H:i:s'); |
这将从用户的本地时区转换为UTC。换一种方式,在用户本地时间显示时间,交换两个时区。
是的,PHP负责DST。必要的转换规则是PHP安装的一部分。通过更新php或更新timezonedb:http://pecl.php.net/package/timezonedb,可以使它们保持最新。
是的,PHP API考虑了DST。大多数时候,你可以安全地执行时间转换,就像死亡所显示的那样。问题是,这并不总是可能的/可行的或有意义的。考虑下面的例子-在波兰(2013年),10月27日凌晨3点,您的时钟向后移动一小时,切换到3月31日的标准时间(偏移UTC+01:00),凌晨2点的时钟向前调整1小时,切换到夏季时间(偏移UTC+02:00)。现在让我们看看grenwich/utc中的"实时"标记,以及php从欧洲/华沙到utc的转换是如何工作的:
1 2 3 4 5 6 7 8 9 10 11 | Europe/Warsaw time offset UTC php2utc conversion php offset 2013-10-27 01:00:00 +2 2013-10-26 23:00:00 2013-10-26 23:00:00 +2 2013-10-27 01:30:00 +2 2013-10-26 23:30:00 2013-10-26 23:30:00 +2 2013-10-27 02:00:00 +2 2013-10-27 00:00:00 2013-10-27 01:00:00 +1 * 2013-10-27 02:30:00 +2 2013-10-27 00:30:00 2013-10-27 01:30:00 +1 * 2013-10-27 02:59:00 +2 2013-10-27 00:59:00 2013-10-27 01:59:00 +1 * 3am -> 2am .....................................summer time changes to standard(winter) time @3am we subtract 1h so 3am becomes 2am 2013-10-27 02:00:00 +1 2013-10-27 01:00:00 2013-10-27 01:00:00 +1 2013-10-27 02:30:00 +1 2013-10-27 01:30:00 2013-10-27 01:30:00 +1 2013-10-27 03:00:00 +1 2013-10-27 02:00:00 2013-10-27 02:00:00 +1 2013-10-27 03:30:00 +1 2013-10-27 02:30:00 2013-10-27 02:30:00 +1 |
如您所见,在凌晨2点到3点之间,PHP无法知道(从调整前/调整后开始)哪一个小时,因此无法可靠地转换。希望这有助于某人的思考;—)