时区与DST处理由PHP

fumotvh3  于 2023-04-10  发布在  PHP
关注(0)|答案(2)|浏览(142)

我正在开发一个日历应用程序。在这个应用程序中,来自不同时区的用户可以创建/查看事件。我想按照下面的方法来保存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

tquggr8v

tquggr8v1#

你把这个问题弄得太复杂了。要使用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来保持最新。

j5fpnvbx

j5fpnvbx2#

是的,php API考虑到了夏令时。大多数时候,你可以安全地执行时间转换的方式deceze已经显示。问题是,它并不总是可能/可行或有意义的。考虑下面的例子-在波兰(2013年)10月27日凌晨3点,你的时钟被向后移动一小时切换到标准时间(偏移UTC+01:00)3月31日凌晨2点,时钟被向前调整一小时切换到夏令时(偏移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点到3点之间,PHP不可能知道“哪个”小时(从调整前/调整后),因此不能可靠地转换。- )

相关问题