【问题标题】:Automagically detecting timezone from reliable system sources从可靠的系统源自动检测时区
【发布时间】:2018-01-03 04:35:36
【问题描述】:

我正在编写一个 CLI PHP 脚本,我希望它显示的日志消息包含正确的本地时间。

此脚本将包含在一个小型软件版本中,并作为配置步骤的一部分在不同的机器(在 Linux 上)上运行。我只需要正确时间戳日志消息的时间,系统的其他部分都不需要当前时间信息,而且我对 PHP 的使用是一个实现细节,所以我觉得要求用户(可能正在安装PHP 只是为了运行它)来编辑脚本或摆弄他们的 PHP 安装来设置date.timezone

我这么说是因为……

  • python -c 'import datetime; print 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()) }'
  • date

...大家都清楚地意识到现在还不是相当凌晨 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 是我的时区文件的副本。请注意,它不是符号链接,因此上述链接中提到的readlink() 解决方法与我无关。

我一再想知道实际打开和解析我的本地时间文件会有多复杂。

DateTime 和各种日期函数无法解析任意 tzinfo 文件。

straceing PHP 显示它在启动时打开并读取/etc/localtime,但令人沮丧的是,该语言并没有以任何方式公开加载的数据。

我无法找到此问题的任何重复项,但如果没有,我会非常感到惊讶,因为在 6写这个。

【问题讨论】:

  • 要明确一点,您的问题是如何从 PHP 中读取系统本地时区标识符? (我没有在上面看到一个实际的问题。)
  • 那行得通,是的。你是对的,实际问题有点迟钝 - 我正在寻找几乎任何允许 PHP 知道相对于我的 PC 时钟而不是 UTC 的正确当前时间的解决方案。我认为这将意味着进行时区偏移,这很好(希望一个好的解决方案不会过于hacky)。

标签: php linux date timezone


【解决方案1】:

通常,您可能希望根据您的应用程序要求在 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);

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    相关资源
    最近更新 更多