【问题标题】:php 7.1/7.0 default timezone issuephp 7.1/7.0 默认时区问题
【发布时间】:2018-07-26 15:55:35
【问题描述】:

在调查 php 7.1/7.0 中的默认时区检测时,我有点困惑: 我们有一个简单的 php CLI 代码:

 php -r "var_dump(ini_get('date.timezone'),date_default_timezone_get());"

根据 php.net 文档 (http://php.net/manual/en/function.date-default-timezone-get.php),由于 date_default_timezone_get 函数我们没有在 php.ini 中设置时区,因此我们应该有 'UTC'。 这里是这段代码的输出:

Command line code:1:
string(0) ""
Command line code:1:
string(16) "America/Anguilla"

这里我们可以看到 ini_get('date.timezone') 等于空字符串,但是 date_default_timezone_get 等于 America/Anguilla

我正在使用:PHP 7.1.12-3+ubuntu14.04.1+deb.sury.org+1 (cli) (built: Dec 14 2017 15:58:40) ( NTS )

php -i 向我们展示:

日期

date/time support => enabled
timelib version => 2016.05
"Olson" Timezone Database Version => 0.system
Timezone Database => internal
Default timezone => America/Anguilla

顺便说一下,这个服务器上的时区是:Asia/Qatar (AST, +0300),但据我所知,它不应该被 php 从 php 5.4 获取。

您能帮我找出这个时区的值是在哪里设置的吗?

更新: 这是一个php 7.1的时区检测功能源码:

       static char* guess_timezone(const timelib_tzdb *tzdb)
    {
        /* Checking configure timezone */
        if (DATEG(timezone) && (strlen(DATEG(timezone))) > 0) {
            return DATEG(timezone);
        }
        /* Check config setting for default timezone */
        if (!DATEG(default_timezone)) {
            /* Special case: ext/date wasn't initialized yet */
            zval *ztz;

            if (NULL != (ztz = cfg_get_entry("date.timezone", 

sizeof("date.timezone")))
            && Z_TYPE_P(ztz) == IS_STRING && Z_STRLEN_P(ztz) > 0 && timelib_timezone_id_is_valid(Z_STRVAL_P(ztz), tzdb)) {
            return Z_STRVAL_P(ztz);
        }
    } else if (*DATEG(default_timezone)) {
        if (DATEG(timezone_valid) == 1) {
            return DATEG(default_timezone);
        }

        if (!timelib_timezone_id_is_valid(DATEG(default_timezone), tzdb)) {
            php_error_docref(NULL, E_WARNING, "Invalid date.timezone value '%s', we selected the timezone 'UTC' for now.", DATEG(default_timezone));
            return "UTC";
        }

        DATEG(timezone_valid) = 1;
        return DATEG(default_timezone);
    }
    /* Fallback to UTC */
    return "UTC";
}

在 php 5.6 及以下版本中,我看到 php 在未设置时区的情况下生成警告:

 /* Fallback to UTC */
    php_error_docref(NULL TSRMLS_CC, E_WARNING, DATE_TZ_ERRMSG "We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.");
    return "UTC";

提前致谢,

最好的问候,

德米特里

【问题讨论】:

  • 如果您要打开error_reporting,您可能会看到一个关于date.timezone 未设置以及您真正需要如何设置的警告。跨度>
  • @Sammitch,我尝试打开错误报告,使用php -r "error_reporting(E_ALL); var_dump(ini_get('date.timezone'),date_default_timezone_get());",但仍然没有看到警告,顺便说一句,我更新了我的帖子并分享了时区检测功能的php源代码
  • 好的,但是您的示例代码仍然显示 date.timezone 的未设置或其他无效设置,并且没有任何其他信息表明您已修复它。
  • @Sammitch 在 php.ini 我有一个注释 ;date.timezone = 字符串和 ini_get('date.timezone') 显示一个空字符串。我只是想了解为什么 php 有默认时区“美国/安圭拉”
  • 是 ????原因 ????你 ???? ????到 ????放 ????它。

标签: php timezone default detect


【解决方案1】:

默认时区很可能是通过date_default_timezone_set [https://www.php.net/manual/en/function.date-default-timezone-set.php] 在初始化供应商代码中或在构建时间。

我认为这是系统打包者should 所做的,而不是让它未定义。如果 PHP 的论点是,自 5.4 以来,由于无法在所有系统中正确猜测该值,那么它不应该全部猜测,它应该由打包程序和安装程序来确定系统的正确值。

我还听说 PHP 开发人员这样做的原因是因为一些 PHP 开发人员使用本地日期时间来显示最终用户时间,这当然应该由用户的浏览器设置或配置决定。日期时区应该只用于诸如日志和地理范围的安装之类的东西。但既然如此,为什么要去掉默认的有用猜测,即使它偶尔会出错呢?

不管怎样,PHP 认为最好强制每个人的 PHP 安装默认报告错误时间,而不是少数人的诅咒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多