我正在编写一个 CLI PHP 脚本,我希望它显示的日志消息包含正确的本地时间。
此脚本将包含在一个小型软件版本中,并作为配置步骤的一部分在不同的机器(Linux 上)上运行。我只需要时间来正确标记日志消息,系统的其他部分都不需要当前时间信息,我对 PHP 的使用是一个实现细节,所以我觉得要求用户(可能正在安装PHP 只是为了运行这个)来编辑脚本或摆弄他们的 PHP 安装来设置 date.timezone
。
我说以上是因为...
python -c '导入日期时间;打印 datetime.datetime.now()'
ruby -e 'print Time.now, "\n"'
perl -MPOSIX -le 'print strftime "%F %T", localtime $^T'
awk 'BEGIN { print strftime("%F %T", systime()) }'
日期
...都正确地意识到现在还不是凌晨 4 点,但实际上已经是下午三点半了。
最初 Node.js 似乎属于同一个顽固的 UTC 阵营,但似乎有一些库能够自动检测当前时区并应用它。我不知道 PHP 有任何类似的东西。
不幸的是,根据https://bojanz.wordpress.com/2014/03/11/detecting-the-system-timezone-php/ , PHP 在 2012 年的 5.4 版本中不再关注系统的时区概念。
我不完全理解为什么当我刚刚测试的其他 4 种主要编程语言运行良好时,PHP 决定认输并诉诸“用户硬编码或破产”。
话虽这么说,但我相信这是有正当理由的,而且我非常愿意阅读相关内容。
在我的 (Slackware) 系统上,TZ 未设置,但 /etc/localtime
是我的时区文件的副本。请注意,它不是符号链接(symbolic link),因此上述链接中提到的readlink()
解决方法与我无关。
我反复想知道实际打开和解析我的本地时间文件会有多复杂。
DateTime 和各种日期函数无法解析任意 tzinfo 文件。
strace
ing PHP 显示它在启动时打开并读取 /etc/localtime
,但令人沮丧的是,该语言不会以任何方式公开加载的数据。
我找不到这个问题的任何重复项,但如果没有,我会非常感到惊讶,因为在写这个。
最佳答案
通常您会希望根据您的应用程序要求在 php.ini 中设置时区,但我知道对于您将要手动使用的 CLI 工具而不是 cron 作业,您可能希望使用系统时区.你可以试试这个:
$ret = null;
$output = null;
exec('date +%Z', $output, $ret);
if ($ret)
{
throw new Exception("Failed to get system timezone");
}
$timezone = $output[0];
然后您可以将其设置为脚本中的默认时区:
date_default_timezone_set($timezone);
关于php - 从可靠的系统来源自动检测时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48071229/