关于datetime:PHP的DST处理时区

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
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库吗?

参考文献:-PHPS日期默认时区设置是否调整为夏令时?-给定位置的get-timezone-offset


你太过分了。要使用DateTime在两个时区之间转换,请执行以下操作:

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无法知道(从调整前/调整后开始)哪一个小时,因此无法可靠地转换。希望这有助于某人的思考;—)