Я немного запутался при исследовании определения часового пояса по умолчанию в 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) у нас должно быть ‘UTC’ в результате функции date_default_timezone_get, потому что мы не устанавливаем часовой пояс в 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.
Не могли бы вы помочь мне узнать, где было установлено это значение для этого часового пояса?
ОБНОВЛЕНО:
Это исходный код 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";
Заранее спасибо,
С уважением,
Дмитрий
Задача ещё не решена.
Других решений пока нет …