php - 从可靠的系统来源自动检测时区

标签 php linux date timezone

我正在编写一个 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 文件。

straceing 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/

相关文章:

php - ZF : Disable Resource Plugin in application. ini

java - Desktop.Desktop.getDesktop().open(新文件(路径));给出 java.awt.HeadlessException

php - 如何在不使用自动加载的情况下使用 PHPMailer 创建邮件功能

php - 在 MySQL [PHP] 中存储发布元数据的最佳实践

php - 使用带有连字符的 extract()

r - 从类似 : "%B %d, %Y" to a format: "%Y-%m-%d" in R 的格式解析日期

java - Android获取两天之间的天数对于低于和高于6.0的Android返回不同的值

c - 使用 setsockopt;当套接字从另一端关闭时,read 返回 0 而不是 -1

python - 在 Bash 脚本中获取/激活 Python VirtualEnv

java - DateTimeFormatter 无法按预期与 JODA 一起工作