我读得越多,就越困惑。
我的项目计划是以 UTC 格式处理所有日期/时间存储和计算,但显示该数据时除外。问题是服务器将移动到具有不同时区和夏令时信息的不同位置,因此我必须在 UI 中实现某种形式的时区选择器。
但夏令时发生和不发生的地方都有各种异常(exception)情况,例如亚利桑那州没有夏令时,纳瓦霍印第安保留地除外。所以我不能简单地使用时区位置的 PHP 列表(例如“美国/凤凰城”),因为我不知道服务器的实际位置是否会在这样的区域,所以我猜我会必须实现一个显示“使用夏令时”的复选框和一个带有简单时区信息的更基本的选择框,例如“科委-6”等
我可以使用“America/Phoenix”系统来显示城市列表,但这会导致列表非常长。但是,如果我在我的列表中使用 EST/CST,对于有 DST 的区域和没有 DST 的区域来说,它是不准确的,所以我认为如果没有“DST?”我无法做到这一点。复选框。
但是,我刚刚尝试了 PHP 的 DateTime
和 DateTimeZone
以及 'CST'、'CDT' 和 'CST6CDT',这三个结果同时出现,两者二月的约会和六月的约会。我想,CDT应该带夏令时,CST应该不带夏令时,CST6CDT应该使用自动切换,但显然没那么简单……
所以...如果我使用 EST/CST/PST 等时区列表并希望能够通过复选框关闭 DST,我将如何在 PHP 代码中实现它?我如何告诉 PHP 将时间转换为正确的时区并支持打开或关闭 DST?
我知道这个的基本代码,但不知道如何更改夏令时:
$myTime = new DateTime('02/10/2013 08:00:00', new DateTimeZone('UTC'));
var_dump($myTime); // UTC
$localTz = new DateTimeZone('America/Phoenix'); // selected by user
$myTime->setTimezone($localTz);
var_dump($myTime); // Phoenix with local DST settings
关于不同但相关的说明,更改 Linux 服务器的位置是否会导致服务器的内部时钟更改时区?移动服务器是否会扰乱内部时钟并导致不正确的 UTC 时间戳?
最佳答案
作为一个花了 13 个月时间围绕此进行重大重构的人,我可以告诉你:你必须存储用户意图时间,然后将其解码为查看器本地时间。
我所说的“用户意图时间”是时间和用户所在时区的组合。随着 DST 的变化,您将需要使用两种信息来解码为来自不同位置的用户显示的时间。我不只是指何时发生 Spring 和秋季转换 - 我的意思是当政府更改 DST 法律和更新 Olson tzdata 数据库时。
您确实有一个 cron 作业来经常从 PECL 更新 tzdata,对吧? :)
您会想要使用 - 并且可能会扩展 - PHP 有缺陷的 DateTime 和 DateTimeZone 内置函数。他们是您唯一的希望。
关于php - PHP 中带和不带 DST 的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17151584/