【发布时间】: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