PHP 7.1 / 7.0默认时区问题

时间:2018-07-26 15:55:36

标签: php timezone default detect

在研究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函数的结果,我们应该使用'UTC',因为我们没有在php.ini中设置时区。 这是这段代码的输出:

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 5.4中的php占用。

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

已更新: 这是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";
}

在5.6或更低版本的php中,如果未设置时区,我会看到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";

预先感谢

最好的问候,

德米特里

1 个答案:

答案 0 :(得分:0)

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

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

我也听说 PHP 开发人员的原因是一些 PHP 开发人员使用本地日期时间来呈现最终用户时间,这当然应该由用户的浏览器设置或配置决定。日期时区应该只用于日志和地理限制安装之类的东西。但既然如此,为什么要删除默认的有用猜测,即使偶尔会出错?

无论如何,PHP 确定强制每个人的 PHP 安装默认报告错误时间要好得多,而不是这成为少数人的诅咒。