在研究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";
预先感谢
最好的问候,
德米特里
答案 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 安装默认报告错误时间要好得多,而不是这成为少数人的诅咒。