php 7.1/7.0默认时区问题



在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等于美国/安圭拉

我使用的是: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中获取。

你能帮我查一下这个时区的值是在哪里设置的吗?

更新时间:这是一个php7.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";
}

在php5.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";

提前感谢

谨致问候,

德米特里

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

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

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

不管怎样,PHP决定强制每个人的PHP安装默认报告错误的时间要好得多,而不是这是少数人的诅咒。

最新更新