时区与DST处理由PHP(timezone with DST handling by PHP)

2019-07-04 11:57发布

我工作在一个日历应用程序。 在这个用户从不同的时区创建/查看事件。 我想按照下面的方法来活动时间保存在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.

我的问题:

  • 无论上述照顾DST的用于所有区域的PHP的API?
  • 夏令时间本身的变化在不同年份,如何PHP获取这方面的信息? 我们需要升级PHP? 如果这样做,我们需要升级所有的或特定的PHP库?

参考文献: - 不-PHPS-日期默认时区设置调整到夏令 - 得到-时区偏移-FOR-A-给定地点

Answer 1:

你太过分复杂这一点。 要使用两个时区之间进行转换DateTime ,这样做:

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 。



Answer 2:

是的PHP API考虑到DST。 大多数时候,你可以放心地执行deceze方式表明时间转换。 问题是,它并不总是可行/可行或有意义。 考虑下面的例子 - 在凌晨3点10月27日你的时钟移回一小时,切换到标准时间波兰(2013年)(偏移UTC + 01:00)3月31日凌晨2点时钟由1H切换到夏天向前调整时间(偏移UTC + 02:00)。 现在,让我们看看“实时”如何蜱Grenwich / UTC以及如何通过PHP从欧洲转换/华沙UTC的工作原理:

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 am-3am之间看有没有办法PHP可以知道“这”小时值(前/调整后),这是因此不能可靠地转换。 希望这可以帮助别人在他/她的讨论;-)



文章来源: timezone with DST handling by PHP