php - PHP 中带和不带 DST 的时区

标签 php timezone

我读得越多,就越困惑。

我的项目计划是以 UTC 格式处理所有日期/时间存储和计算,但显示该数据时除外。问题是服务器将移动到具有不同时区和夏令时信息的不同位置,因此我必须在 UI 中实现某种形式的时区选择器。

但夏令时发生和不发生的地方都有各种异常(exception)情况,例如亚利桑那州没有夏令时,纳瓦霍印第安保留地除外。所以我不能简单地使用时区位置的 PHP 列表(例如“美国/凤凰城”),因为我不知道服务器的实际位置是否会在这样的区域,所以我猜我会必须实现一个显示“使用夏令时”的复选框和一个带有简单时区信息的更基本的选择框,例如“科委-6”等

我可以使用“America/Phoenix”系统来显示城市列表,但这会导致列表非常长。但是,如果我在我的列表中使用 EST/CST,对于有 DST 的区域和没有 DST 的区域来说,它是不准确的,所以我认为如果没有“DST?”我无法做到这一点。复选框。

但是,我刚刚尝试了 PHP 的 DateTimeDateTimeZone 以及 '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/

相关文章:

PHP htmlentities 不工作?输出是?

javascript - Bootstrap Modal 不随默认浏览器页面滚动条滚动

python - 确定当天的开始和结束时间(UTC -> EST -> UTC); Python

javascript - Node.js 在哪里获得它的时区以及如何全局设置它?

php - 在 Centos 7 上为 Laravel 5.6 安装 PHP 7.2

php - SMTP 服务器响应 : 550 - currently not permitted to relay 550-through this server

php - 检查单击了哪个按钮

php - 我的数据库中节省的时间提前了近 15 个小时

c# - 我可以强制 ASP.Net 网站显示特定时区的时间吗?

javascript - Google Apps 脚本 : Calendar . getEvents 导入错误时区的事件