Ini-параметр даты и часового пояса не настроен

Обновлено: 02.07.2024

Есть два способа настроить значения php.ini для вашего приложения. Рекомендуемый метод — использовать свойство переменных .platform.app.yaml для установки значений ini с использованием префикса php. Например, чтобы увеличить лимит памяти PHP, вы должны поместить в .platform.app.yaml следующее:

Также можно предоставить собственный файл php.ini в репозитории в корне приложения (где находится ваш файл .platform.app.yaml).

Еще один пример — установить часовой пояс среды выполнения PHP (хотя настройки часового пояса контейнеров/служб останутся в формате UTC):

Директивы конфигурации php.ini для конкретной среды могут быть предоставлены через переменные среды отдельно от кода приложения. См. примечание о переменных среды.

Отключение функций

Общая рекомендация для защиты установки PHP – отключить некоторые встроенные функции, которые часто используются при удаленных атаках. По умолчанию Platform.sh не отключает никакие функции, поскольку все они находят законное применение в различных приложениях. Однако вы можете отключить их самостоятельно, если знаете, что они не нужны. Например, чтобы отключить pcntl_exec и pcntl_fork (которые в любом случае нельзя использовать в веб-запросе):

Общие функции, которые следует отключить, включают:

Естественно, если ваше приложение использует какие-либо из этих функций, оно потерпит неудачу, если вы их отключите. В этом случае не отключайте их.

Настройки php.ini по умолчанию

Значения по умолчанию для некоторых часто изменяемых параметров php.ini перечислены ниже.

memory_limit=128M

post_max_size=64M

upload_max_filesize=64M

display_errors=Вкл.

Это значение включено по умолчанию, чтобы упростить настройку проекта на платформе.sh. Мы настоятельно рекомендуем добавить собственный обработчик ошибок в ваше приложение или установить для этого параметра значение Выкл., прежде чем запускать сайт.

zend.assertions=-1

Утверждения оптимизируются и не влияют на время выполнения. У вас должно быть установлено значение 1 для вашей локальной системы разработки.

opcache.memory_consumment=64

Это количество мегабайт, доступное для opcache. Для больших приложений с большим количеством файлов может потребоваться увеличить это значение.

opcache.validate_timestamps=Вкл.

OPCache проверит наличие обновленных файлов на диске. Это необходимо для поддержки приложений, которые генерируют скомпилированный код PHP из конфигурации пользователя. Если вы уверены, что ваше приложение этого не делает, вы можете отключить этот параметр для небольшого повышения производительности.

Предупреждение:

Мы не ограничиваем то, что вы можете поместить в свой файл php.ini, но многие настройки могут нарушить работу вашего приложения. Это средство для опытных пользователей.

Я использую php5.5 и получаю эту ошибку каждый раз, когда использую функцию даты в PHP:

поэтому я изменил настройку date.timezone на это:

Затем перезапускаю сервер:

но по-прежнему возникает эта ошибка, я попытался проверить файл .ini в расположении дополнительных файлов ini, но ни один из них не переопределяет настройку date.timezone

Я проверил права доступа к файлу php.ini, но все равно не работает, пожалуйста, помогите мне решить эту проблему, спасибо..

Примечание: файл php.ini для php-cli отличается от файла php.ini для apache2. Я предлагаю использовать символические ссылки друг на друга, чтобы синхронизировать их и избежать путаницы!

12 ответов 12

Давайте найдем правильный php.ini. Запустите это в apache / nginx / любом веб-сервере, который вы используете (поскольку версия командной строки может отличаться от используемой им).

Что такое .ini на выходе? Всё так же?

После редактирования php.ini просто перезапустите веб-сервер (apache или nginx).

наконец решил мою проблему, это мой загруженный файл конфигурации:

изменил здесь date.timezone, но это не работает.

Итак, я проверяю значения "Сканировать этот каталог на наличие дополнительных файлов .ini" в phpinfo(), которые указывают на:

затем я ищу date.timezone во всех файлах в этой папке, но ничего не нахожу.

это мое дополнительное значение файла .ini, проанализированное в phpinfo():

Я изменил /etc/php5/apache2/conf.d/20-xdebug.ini и добавил эту строку:

очень странно, но это решило мою проблему.

Я также хотел добавить, что нашел файл .ini в своем каталоге «дополнительные файлы .ini» с именем 99-liip-developer.ini, не знаю, как он туда попал, но у него было date.timezone = Europe/Zurich и сводил меня с ума, удалил, и мой код в файле php.ini работал правильно

Вы должны проверить, найдя php.in, если где-то есть еще один.

для меня. должен быть CLI для интерфейса командной строки:

изменить файл /etc/php5/cli/php.ini

Теперь это работает для меня.

Другим решением для меня после компиляции PHP из исходного кода было проверить, что php.ini действительно загружает файл конфигурации. Из командной строки

Перезапустите php (в моем случае /etc/init.d/php-fpm stop , /etc/init.d/php-fpm start ), и он отлично работает. По какой-то причине он был скопирован неправильно.

  • Дистр: Centos 7
  • Веб-сервер: Nginx
  • Тип: экземпляр EC2

(на macOS Sierra здесь): обратите внимание, что в моей установке php -i | grep php.ini говорил мне, что мой php.ini был /etc/php.ini. Тем не менее, когда я запустил php --ini , я смог увидеть, что мой php.ini на самом деле загружается из /usr/local/etc/php/5.6/php.ini. Я не знаю, почему php cli показывает 2 значения, но на случай, если это кому-то поможет.

Недавно я столкнулся с той же проблемой в PHP 5.6.4.

  • PHP 5.6.4 ведет себя странно
  • PHP 5.6.11 ведет себя нормально, как и ожидалось

Когда я помещаю параметр конфигурации date.timezone в раздел [PHP] файла конфигурации, он отлично работает для PHP 5.6.4. Например, я добавил эту опцию в самое начало файла php.ini

Но когда я добавляю параметр конфигурации, как это показано в примере в разделе [Дата], он не работает должным образом, похоже, что параметр игнорируется

Еще раз проблема возникла у меня только с PHP 5.6.4. Когда я изменил параметр на сервере с PHP 5.6.11, он повел себя именно так, как я и ожидал.

Часовой пояс для PHP не установлен (параметр конфигурации "date.timezone").

Как мне это решить, из "Проверки предварительных условий на localhost/zabbix/setup.php?

Я попытался установить часовой пояс в php.ini, как это предлагается здесь. Но не повезло.

Я запускаю Zabbix на Ubuntu, которая работает на VirtualBox. После установки Ubuntu я следовал инструкциям здесь.

Теперь я пытаюсь войти в графический интерфейс и начать мониторинг. Но эта проблема с часовым поясом блокирует меня.

Спасибо за помощь.


Вы пытались изменить параметр date.timezone в файле /etc/apache2/conf-available/zabbix.conf, который упоминался в шагах установки?

p/s необходимо перезапустить apache, чтобы изменения вступили в силу.

Комментарий

Вы имеете в виду этот документ?

Я изменил параметры в соответствии с рекомендациями, в частности date.timezone = UTC.

Перезапуск apache с помощью этой команды: /etc/apache2/conf.d/zabbix.conf приводит к сообщению об ошибке:

* Перезапуск веб-сервера apache2 /usr/sbin/apache2ctl:87: ulimit: ограничение установки ошибок (операция не разрешена)
/usr/sbin/apache2ctl: 87: ulimit: ограничение установки ошибок (операция не разрешена)
(13)Отказано в доступе: make_sock: не удалось выполнить привязку к адресу 0.0.0.0:80
нет доступных прослушивающих сокетов, завершение работы

Использование sudo apache перезапускает, но часовой пояс php по-прежнему «неизвестен» и «сбой».

Спасибо за вашу помощь, я действительно ценю это.

Комментарий

Наверное, соответствующая строка в файле /etc/php5/apache2/php.ini была закомментирована. я этого не знал; в начале строки комментарий.

Я удалил его, и теперь необходимое условие работает.

Комментарий

Большое спасибо за подсказку.

В Zabbix 4.4.7 при добавлении виджета "Информация о системе" на панель управления появлялось предупреждение "Опция PHP "date.timezone" неизвестна Часовой пояс для PHP не установлен (параметр конфигурации "date.timezone") ".
Кроме этого, я не сталкивался с другими связанными с этим проблемами.

Установка часового пояса в файле /etc/apache2/conf-available/zabbix-frontent-php.conf (с последующим перезапуском службы sudo apache2) не устранила предупреждение/ошибку.
После ручной установки даты и часового пояса в файле /etc/php/7.2/apache2/php.ini (с последующим перезапуском службы sudo apache2) предупреждение исчезло.

Установка одного и того же значения дважды вызывает у меня нехорошее предчувствие.
=> Кто-нибудь может уточнить?
=> Какая информация необходима для дальнейшего анализа этого поведения?

PS: В моем случае параметр в php.ini находился в строке 937. В nano номера строк отображаются после ALT + C.

Комментарий

Двойная установка date.timezone не повредит, но это также ненужное дублирование.

Установка его через php_value/php_admin_value в любом файле конфигурации apache выходит из моды, прежде всего потому, что использование PHP в качестве загружаемого модуля больше не рекомендуется. PHP через пул PHP-FPM — более современный способ запуска PHP. Я могу понять, почему документы Zabbix по-прежнему смешивают настройки php с настройками Apache и по умолчанию используют загружаемый модуль. Меньше файлов для настройки, и большинство людей, вероятно, знакомы с методом mod_php.

При использовании PHP-FPM вся конфигурация PHP выполняется либо на уровне пула FPM, либо через глобальную конфигурацию PHP.

Поскольку часовой пояс, в котором работает система, является глобальным свойством, на моем сайте мы обычно устанавливаем часовой пояс глобально, а не для каждого пула. Чтобы нашей системе управления конфигурацией было проще управлять конфигурацией PHP, мы обычно оставляем файл php.ini без изменений, помещая любые глобальные настройки в пронумерованный файл conf в каталоге php.d/. Файлы conf загружаются после php.ini, поэтому настройки там могут переопределять стандартный файл конфигурации.

date_default_timezone_set() устанавливает часовой пояс по умолчанию, используемый всеми функциями даты/времени.

Вместо использования этой функции для установки часового пояса по умолчанию в вашем скрипте вы также можете использовать настройку INI date.timezone для установки часового пояса по умолчанию.

Параметры

Идентификатор часового пояса, например UTC , Africa/Lagos , Asia/Hong_Kong или Europe/Lisbon . Список допустимых идентификаторов доступен в списке поддерживаемых часовых поясов.

Возвращаемые значения

Эта функция возвращает false, если timezoneId недействителен, или true в противном случае.

Примеры

if ( strcmp ( $script_tz , ini_get ( 'date.timezone' ))) echo 'Часовой пояс сценария отличается от часового пояса, установленного в ini.' ;
> else echo 'Часовой пояс скрипта совпадает с часовым поясом, установленным в ini.' ;
>
?>

См. также

  • date_default_timezone_get() — получает часовой пояс по умолчанию, используемый всеми функциями даты/времени в скрипте.

Примечания, внесенные пользователями 22 примечания

Я уверен, что я не единственный, кто обеспокоен недавним изменением поведения по умолчанию на E_NOTICE, когда часовой пояс явно не установлен в программе или в .ini. Я гарантирую, что часы на сервере ПРАВИЛЬНЫ, и я не хочу устанавливать их в двух местах (система И PHP). Поэтому я хочу прочитать его из системы. Но PHP не принимает этот ответ и настаивает на вызове этой функции. Итак, вот мой ответ:

Функция

setTimezone ($default) $timezone = "";

// Во многих системах (например, Mac) "/etc/localtime" является символической ссылкой
// на файл с информацией о часовом поясе
if ( is_link ("/etc/localtime" ))

// Если это так, то имя этого файла на самом деле является часовым поясом формата "Olsen"
$filename = readlink ("/etc/localtime" );

$pos = strpos ( $filename , "zoneinfo" );
if ( $pos ) // Если да, то он находится в папке "/usr/share/zoneinfo/"
$timezone = substr ( $filename , $pos + strlen ("zoneinfo/" ) );
> else // Если нет, залог
$timezone = $default ;
>
>
else // В других системах, таких как Ubuntu, есть файл со временем Олсена
// прямо внутри него.
$timezone = file_get_contents ("/etc/timezone");
if (! strlen ( $timezone )) $timezone = $default ;
>
>
date_default_timezone_set ( $timezone );
>
?>

Используйте его, вызвав его с резервным ответом по умолчанию.

Да, я знаю, что это не работает в Windows. Я тоже :) Возможно, кто-то захочет добавить эту функциональность.

Надеюсь, это кому-нибудь поможет.

Это создает огромную проблему для загружаемых программ, которые, очевидно, не могут быть жестко закодированы, как это предполагает, поскольку кодировщик понятия не имеет, где они будут запускаться.

Мне кажется, что если нельзя полагаться на часовой пояс сервера, то ЭТО проблема, которую необходимо решить. Нет, это приведет к тому, что синтаксически правильная работа кодера будет генерировать поддельные сообщения об ошибках.

Как сказал Кристофер Крамер 9 лет назад, отсутствие установки часового пояса по умолчанию влияет на производительность PHP 5.6 и PHP 7.1

Его больше нет в php 7.2.

Поскольку я установил для error_reporting значение 0 в своем скрипте, кажется, что это не связано с тем фактом, что ошибка регистрируется в журнале.

Я запускал тестовый скрипт (модифицированный) в Linux несколько раз, чередуя настройки "включено" и "выключено":

$tz = ( $argc > 1 && ( $argv [ 1 ] == 'on' )) ? 'on' : 'off' ;
if ( $tz == 'on' ) date_default_timezone_set (@ date_default_timezone_get ());

$start = mktime(0, 0, 0, 1, 1, 2005);
$end = mktime ( 0 , 0 , 0 , 1 , 1 , 2020 );

echo "Время ( $tz ): " .(( микровремя ( true ) - $t0 )* 100 ). "\п" ;

> Я уверен, что я не единственный, кто обеспокоен недавним изменением поведения по умолчанию на E_NOTICE, когда часовой пояс явно не установлен в программе или в .ini.

Вы всегда должны включать уведомления и иметь обработчик ошибок клиента, который преобразует уведомления или любые сообщения PHP в исключения.

Я занимаюсь этим уже много лет, и похоже, что расширение использования исключений в самом PHP — это непрерывный процесс. Он почти наверняка застрял с уведомлениями из устаревших шаблонов до того, как PHP обладал возможностью исключения, по причине того, что он не был полностью применен, из-за поломки BC.

Даже в своих расширениях я перенаправляю уведомления и предупреждения в исключения. Я уверен, что все давление на ?? оператор должен был упростить ошибки для исключений, поскольку единственным реальным недостатком этого является необходимость использовать isset немного больше.

Аналогично для утверждений, json и т. д., и т. д. – для использования исключений.

Еще одно замечание. Я профилировал свой PHP-скрипт, и он сообщил, что вызов этой функции занял половину времени. Кто-нибудь еще получил это? Неужели так дорого? Я удваиваю время инициализации, не имея его в php.ini и, возможно, устанавливая часовой пояс, в котором он уже находится? Или это игра со временем и нарушение измерения времени? Однажды я постараюсь заключить его в микровремя, чтобы попытаться увидеть.

Люди жалуются, что нет возможности установить смещение - вы ошибаетесь. Вы можете легко установить смещение от GMT (см. «Другое» в доступных зонах). А так как все зоны смещены от GMT, это можно легко вычислить с помощью + или -. Итак, если вы хотите смещение не от GMT, а от вашего часового пояса, то вычислите смещение вашей зоны от GMT (скажем, если вы в Берлине сейчас +1 (помните о летнем времени!)), а затем смещение для вашей целевой зоны (т.е. Нью-Йорк -5) тогда суммируй абс! из этих значений и установите знак большего значения (абс.) -> общее смещение от вашей европейской зоны до Нью-Йорка, тогда будет абс (-5) + абс (1) = 6 и установите «-», так как абсолютное значение зоны Нью-Йорка больше. Итак, какое бы время ни было в Берлине, в Нью-Йорке оно на 6 часов раньше. Но лучше делать расчет в два шага и считать всегда по Гринвичу

Функция

set_tz_by_offset ($offset) <
$offset = $offset * 60 * 60 ;
$abbrarray = timezone_abbreviations_list ();
foreach ( $abbrarray as $abbr ) <
//echo $abbr."
";
foreach ( $abbr as $city ) <
//echo $city['offset']." $offset
";
if ( $city [ 'offset' ] == $offset ) < // не забудьте умножить $offset на -1, если вы получаете его из js
date_default_timezone_set ( $city [ 'timezone_id' ] );
вернуть истину;
>
>
>
date_default_timezone_set ("ust");
вернуть ложь;
>

?>

[РЕДАКТИРОВАТЬ thiago AT php DOT net: Этот код создан на основе материалов iateadonut из gmail dot com]

После долгих размышлений и стуков головой о стол я наконец-то получил правильное исправление для обработки часовых поясов Windows и PHP.

Поскольку Windows применяет летнее время к ActiveTimeBias в реестре, вам нужно только это применить.
Единственная проблема заключается в том, что она не может использовать команду timezone_set.

Вы можете запросить ответ в любом формате даты или использовать формат по умолчанию, указанный в самой функции.

// Возвращаем правильное время
функция time_zone_fix ($timeGiven = "H:i:s")
$shell = new COM ("WScript.Shell") или die( "Требуется Windows Scripting Host ");
$time_bias = -( $shell -> RegRead ("HKEY_LOCAL_MACHINE\\SYSTEM\\
CurrentControlSet\\Control\\TimeZoneInformation\\
ActiveTimeBias" )) / 60 ;
$timestamp_bias = 60 * 60 * $time_bias ;
эхо $time_bias . "
" ;
возврат gmdate ( $timeGiven , strtotime ( $timestamp_bias . "seconds" ));
>
?>

Это хороший сценарий, если вы знаете или контролируете свою систему, чтобы знать, что локальная TZ в вашей ОС верна. К сожалению, этот сценарий по-прежнему создает предупреждающее сообщение в BSD UNIX.

Чтобы это исправить, просто добавьте "@" перед "localtime" следующим образом:

date() [function.date]: небезопасно полагаться на системные настройки часового пояса. Используйте параметр date.timezone, переменную среды TZ или функцию date_default_timezone_set(). Если вы использовали какой-либо из этих методов и все еще получаете это предупреждение, вы, скорее всего, ошиблись в идентификаторе часового пояса. Вместо этого мы выбрали «Америка/Лос-Анджелес» для «PST/-8.0/без летнего времени»

Конечно, это проблема, возникшая недавно, начиная с PHP5. Быстрое исправление заключается в том, чтобы установить свой часовой пояс, добавив эту строку в свой php-код:

Большинство сценариев здесь зависят от того, как PHP определяет правильную зону, если она не установлена, но это не всегда происходит.

Например, PHP 5.3.3 выдает результат "UTC" для обнаруженного "8.0/без перехода на летнее время". Не очень помогает.

Итак, для тех из нас, кто по очень веским причинам действительно не может устанавливать часовые пояса в сценариях в файлах .ini, вот функция,
для использования в среде Windows, которая устанавливает часовой пояс по умолчанию на время ОС. zone и возвращает обнаруженные и установленные тексты.

function date_system_timezone_set() <
$shell = new COM("WScript.Shell") or die("Требуется Windows Scripting Host");
$time_bias = -( $shell -> RegRead (
"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control
\\TimeZoneInformation\\Bias" ))/ 60 ;
$ab = -( $shell -> RegRead (
"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control
\\TimeZoneInformation\\ActiveTimeBias" ))/ 60 ;
$sc = $shell -> RegRead (
"HKEY_USERS\\.DEFAULT\\Панель управления\\International\\sCountry" );
foreach( timezone_abbreviations_list() as $tza ) foreach( $tza as $entry ) <
$country = strtok ( $entry [ 'timezone_id' ], '/' );
$locale = strtok ('|');
if( $country == $sc && $ab ==( $entry [ 'offset' ]/ 60 / 60 ) && ( $ds = $time_bias != $ab )== $entry [ 'dst' ]) <
date_default_timezone_set ( $timezone_identifier = $country . "/" . $locale );
вернуть sprintf ( '%.1f' , $ab ). "/" .( $ds ? '' : 'нет' ). «летнее время». " " . $ часовой_идентификатор ;
>
>
вернуть ложь ;
>
?>

PHP 4 не создавал никаких сообщений в журнале и, следовательно, работал так же быстро, как PHP5 с установленным часовым поясом.

Поэтому, если вы запускаете date() или getdate() много раз, это приведет к записи большого количества сообщений журнала на диск (если вы не отключили их в настройках php.ini), что займет пора.

Поэтому либо используйте эту функцию, либо установите в ini-параметре "date.timezone", чтобы ускорить работу.
(И загляните в свои лог-файлы! Устранение всех этих предупреждений не только сэкономит место на диске, но и также ускорьте работу вашего веб-приложения.)

Я убедился, что использование этой функции значительно увеличивает производительность таких функций, как getdate() или date() при использовании PHP 5.2.6 в Windows.
Я получил аналогичные результаты на серверах Linux с PHP 5.2.6 и 5.2.10. , хотя на этих серверах разница была не столь существенной: сервер PHP 5.2.10 работал с date_default_timezone_set ("только") в два раза быстрее, чем без него. Сервер 5.2.6 работал в 5 раз быстрее с date_default_timezone_set. Как вы можете видеть ниже, машина с 5.2.6-Windows работала НАМНОГО быстрее.
Конечно, эти машины имеют совершенно разное оборудование и их нельзя сравнивать, но все они показывают улучшенную производительность.

Я проверил PHP 4.4.9 в Windows (конечно, без date_default_timezone_set) и заметил, что он работает так же быстро, как PHP 5.2.6 с date_default_timezone_set.

Следующий скрипт показывает это:

функция getmicrotime ()
list( $usec , $sec ) = взорвать ( ' ' , microtime ());
возврат ( $sec . substr ( $usec , 1 , 7 ));
>

$start = mktime(0, 0, 0, 1, 1, 2005);
$end = mktime ( 0 , 0 , 0 , 1 , 1 , 2020 );
$nr = 50000 ;

echo "Время: " .( $end_time - $start_time );

// С date_default_timezone_set(): "Время: 0,379343986511"
// Без date_default_timezone_set(): "Время: 7,4971370697"

?>

Обратите внимание, что часовой пояс не меняется, он только устанавливается заново. Мне действительно интересно, почему это так сильно влияет на производительность, но это полезно знать.

Если вы хотите, чтобы пользователи сами выбирали часовые пояса, вот код, который получает все доступные часовые пояса, но использует только один город для каждого возможного значения:

$timezones = DateTimeZone :: listAbbreviations ();

// Для каждого города укажите через запятую список всех возможных часовых поясов для этого города.
foreach( $cities as $key => $value )
$cities [ $key ] = join ( ', ' , $value );

// Оставляем только один город (первый и самый важный) для каждого набора возможностей.
$cities = array_unique ( $cities );

// Сортировка по названию района/города.
ksort ( $cities );

У меня возникли серьезные проблемы с настройкой date.timezone после обновления с 5.3.3 до 5.4.29. Мне все еще нужно обновиться дальше, и, возможно, это ошибка в этой версии, которая будет исправлена ​​​​при обновлении..

Но чтобы решить проблему, когда php не может найти мой часовой пояс, я добавил файл .htaccess в корень моего веб-каталога. Все, что у меня есть, это одна строка (без кавычек)

"php_value date.timezone Америка/Денвер"

И теперь часовой пояс устанавливается в любом каталоге, который я просматриваю. Очень странно, и я до сих пор не понял, почему он не будет работать из файла php.ini. Но вот как преодолеть разочарование.

Я обнаружил необходимость изменить часовой пояс на основе записи БД, чтобы он правильно отображался для каждой записи. Поэтому я включил некоторые другие сообщения в этот небольшой класс:

class TZStack
private $stack = array();
публичная функция __construct()<>
публичная функция push ( $newTZ ​​)
array_push ( $this -> stack , date_default_timezone_get ());
if (isset( $newTZ ​​) && ("" != $newTZ ​​))
date_default_timezone_set ( $newTZ ​​);
>
>
общедоступная функция pop()
if (count ($this -> stack) > 0)
date_default_timezone_set (array_pop ($this -> stack) );
>
>
>
// глобальный стек TZ для остального кода.
$tzStack = новый TZStack ();
// В случае, если мне нужно знать ТЗ на веб-сервере. :)
$script_tz = date_default_timezone_get ();
?>

Тогда в моем коде для каждой записи:

foreach($records as $item)
$tzStack -> push ($item ['TZ']);
$TZ = дата ("T", время ());
// код, который отображает эту запись, используя $TZ.
$tzStack -> поп ();
>
?>

Очень досадно, что нет возможности установить смещение часового пояса. Я попытался использовать код, который искал правильное имя часового пояса по смещению снизу. Я обнаружил, что это не работает надежно, поскольку в разных городах могут быть разные правила в отношении времени DST и т. д. Мое решение состоит в том, чтобы фактически выполнить поиск в массиве и выполнить тест, чтобы убедиться, что смещение является тем, что я ожидаю. Это кажется очень неуклюжим (если это слово), но это работает.

Функция

setTimezoneByOffset ($offset)
<
$testTimestamp = time ();
date_default_timezone_set ('UTC');
$testLocaltime = местное время ( $testTimestamp , true );
$testHour = $testLocaltime [ 'tm_hour' ];


$abbrarray = timezone_abbreviations_list ();
foreach ( $abbrarray as $abbr )
<
//echo $abbr."
";
foreach ( $abbr as $city )
<
date_default_timezone_set ( $city [ 'timezone_id' ]);
$testLocaltime = местное время ( $testTimestamp , true );
$hour = $testLocaltime [ 'tm_hour' ];
$testOffset = $час - $testHour ;
if( $testOffset == $offset )
<
вернуть true ;
>
>
>
вернуть false ;
>
?>

Обратите внимание, что могут возникнуть некоторые неожиданные побочные эффекты, возникающие в результате использования set_default_timezone() или функции putenv("TZ=.") для более ранних версий PHP. ЛЮБАЯ дата, отформатированная и выведенная либо PHP, либо его хост-процессом apache, будет безоговорочно выражена в этом часовом поясе.

[красный. Это верно только для хака putenv() — Дерик]

Это действительно включает журналы веб-сервера и другие выходные файлы и отчеты, которые по умолчанию обычно не включают никаких указаний часового пояса. Очевидно, это оказывает дополнительный побочный эффект на обработку и анализ журналов.

Я избегаю использования строк в качестве аргументов, когда необходимо использовать константу или другую ссылку. Например, чтобы установить часовой пояс по умолчанию в формате UTC, рекомендуемый код:

date_default_timezone_set ('UTC'); // Возможны ошибки
?>

Однако использование здесь строки "UTC" открывает возможность для ошибок. Например, если строка "UTX" была введена случайно,
большинство PHP-редакторов PHP не отметит это как ошибку. При запуске интерпретатор покажет обычное предупреждение о неправильном написании часового пояса и использовании по умолчанию «UTC».

В PHP следует определить константы для представления основных часовых поясов. На самом деле это так, но "DateTimeZone::UTC" неудобно содержит целочисленное значение 1024, а не строку. Однако "DateTimeZone::listIdentifiers()" может превратить целое число часового пояса в массив строк идентификатора часового пояса. Итак, я использую этот код:

date_default_timezone_set ( DateTimeZone :: listIdentifiers ( DateTimeZone :: UTC )[ 0 ]); // Защита от дурака
?>

Это длиннее, но если я допущу ошибку при указании часового пояса (чего я не сделаю, потому что использую автозавершение кода), мой редактор выделит проблему. Если бы я все равно запустил программу с недопустимой ссылкой на часовой пояс, PHP выдал бы более полезную ошибку: «Неустранимая ошибка: неопределенная константа класса «UTX» в /tmp/tarfu.php в строке 24».

Простой способ общения между двумя часовыми поясами.

$date = new DateTime ("2012-07-05 16:43:21" , new DateTimeZone ("Европа/Париж" ));

вывести дату ("Y-m-d h:iA", $date -> format ('U'));

Если вы хотите установить в качестве часового пояса по умолчанию локальный часовой пояс пользователя, вам необходимо объединить PHP и JavaScript. Вот как это сделать:

session_start ();
if(!isset( $_SESSION [ 'часовой пояс' ]))
if(!isset( $_REQUEST [ 'смещение' ]))
?> < br />
var d = new Date()
var offset= -d.getTimezoneOffset()/60;
location.href default"> ?offset default"> >
else
$zonelist = array( 'Kwajalein' => - 12.00 , 'Pacific/Midway' => - 11.00 , 'Pacific /Гонолулу' => - 10.00 , 'Америка/Анкоридж' => - 9.00 , 'Америка/Лос-Анджелес' => - 8.00 , 'Америка/Денвер' => - 7.00 , 'Америка/Тегусигальпа' => - 6.00 , 'Америка /New_York' => - 5.00 , 'Америка/Каракас' => - 4.30 , 'Америка/Галифакс' => - 4.00 , 'Америка/Сент-Джонс' => - 3.30 , 'Америка/Аргентина/Буэнос_Айрес' => - 3.00 , 'Америка/Сан-Паулу' => - 3.00 , 'Атлантика/Южная_Грузия' => - 2.00 , 'Атлантика/Азорские острова' => - 1.00 , 'Европа/Дублин' => 0 , 'Европа/Белград' => 1.00 , 'Европа /Минск' => 2.00 , 'Азия/Кувейт' => 3.00 , 'Азия/Тегеран' => 3.30 , 'Азия/Маскат' => 4.00 , 'Азия/Екатеринбург' => 5.00 , 'Азия/Калькутта' => 5.30 , 'Азия/Катманду' => 5.45 , 'Азия/Дакка' => 6.00 , 'Азия/Рангун' => 6.30 , 'Азия/Красноярск' => 7.00 , 'Азия/Бруней' => 8.00 , 'Азия/ Сеул' => 9.00 , 'Австралия/Дарвин' => 9.30 , 'Австралия/Канберра' => 10.00 , 'Азия/Магадан' => > 11.00 , 'Тихий океан/Фиджи' => 12.00 , 'Тихий океан/Тонгатапу' => 13.00 );
$index = array_keys ($zonelist, $_REQUEST ['смещение']);
$_SESSION ['часовой пояс'] = $index[0];
>
>
date_default_timezone_set ( $_SESSION [ 'часовой пояс' ]);

< бр />

Если вы заметили неправильное время в PHP-скриптах, вероятной причиной является то, что хост-сервер находится в другом часовом поясе.

Например, если вы являетесь клиентом веб-хостинга InMotion, вы можете выбрать один из центров обработки данных в Вашингтоне, округ Колумбия, или в Калифорнии, что означает, что часовой пояс сервера будет либо восточным стандартным временем (EST), либо тихоокеанским стандартным временем (PST). ).

Если вы хотите изменить это, это быстро исправить. Просто вставьте строку кода в ваш файл php.ini, и местоположение, которое вы задали в коде, определит время, которое будет отображаться в ваших PHP-скриптах.Продолжайте читать, чтобы узнать, как это сделать.

Установите часовой пояс в PHP

  1. Откройте файл php.ini с помощью диспетчера файлов в cPanel.
  2. Добавьте следующую строку кода в начало файла php.ini: date.timezone = "US/Central" .

Часовой пояс в php.ini файл

Сохранить изменения для нового часового пояса

 Настройка часового пояса до изменения
Часовой пояс после изменения

Поздравляем! Теперь вы можете установить часовой пояс в PHP. Если вы хотите увидеть больше руководств с советами и информацией о проблемах с вашим веб-сайтом, посетите наш Центр поддержки хостинга InMotion!

Продавайте хостинг под собственным брендом с помощью решения InMotion Hosting Reseller Hosting.

Как автор InMotion Hosting, Арнел всегда стремился делиться полезной информацией и предоставлять знания, которые помогут решить проблемы и помочь в достижении целей. С 2004 года он также принимает активное участие в местных группах и мероприятиях WordPress.

39 комментариев

Болезненный урок для тех разработчиков приложений, которые три недели назад говорят, что они прошли тестирование (регрессивное?), а потом приходят к вам и говорят, что все в порядке. Я думаю, как человек, который обновил его, я должен был проверить это сам.

Я изменил файл ini.php часового пояса, и он был успешно изменен, даже если я тестировал phpinfo.php, он показывает там то же самое, что и мои изменения. но время на моем сайте такое же, как и раньше (неправильное время). Итак, посоветуйте, что делать?

Мы будем рады помочь вам в дальнейшем устранении неполадок, но нам потребуется дополнительная информация. Как/где отображается время на вашем сайте? Можете дать ссылку на сайт, чтобы мы могли посмотреть время?

Спасибо,
Джон-Пол

Здравствуйте, не могли бы вы научить меня, как настроить VPS? у меня проблемы, потому что у меня нет файла php.ini в общедоступном HTML

Я рекомендую обратиться в службу поддержки Live, чтобы они могли скопировать файл php.ini сервера по умолчанию в вашу учетную запись. Затем вы можете изменить php.ini, как описано выше.

Спасибо,
Джон-Пол

Отличный учебник. Это руководство было действительно полезным для установки часового пояса.

Хорошее руководство. Это руководство было очень полезно для меня в заданном часовом поясе.

Я установил часовой пояс asia/kolkata на своем сервере, но он показывает время на 4 минуты вперед, чем фактическое время часового пояса, пожалуйста, помогите мне.

Если вы внесли изменения в файл php.ini, возможно, у вас есть другой файл PHP.INI, в котором изменение не имеет прецедента. Убедитесь, что файл php.ini с настройкой часового пояса является рекурсивным. Вот статья о том, как это сделать: Как сделать мой файл php.ini рекурсивным. Если проблема не исчезнет, ​​сообщите нам об этом.

Если у вас есть дополнительные вопросы или комментарии, сообщите нам об этом.

С уважением,
Арнел С.

Что вам конкретно нужно в данном случае для Западной Африки, и будет одинаковым независимо от того, в какой части мира вы находитесь, так это сначала узнать, какое у вас смещение UTC, а затем использовать смещение из списка, которое соответствует этому. Например, я живу на северо-западе Тихого океана в США, и наше смещение равно -7 (то есть минус семь), и в настоящее время мы находимся в переходе на летнее время (также известное как PDT). Когда не летнее время года, у нас -8 по тихоокеанскому стандартному времени.

Итак, мы минус семь часов от GMT, также известного как UTC, который равен 0, а иногда выражается +0.

Короткий ответ: найдите свое смещение и используйте то, которое соответствует. Их много, и я думаю, что некоторые из них имеют одинаковое смещение UTC.

В моей учетной записи реселлера нет php.ini ни в одном аккаунте — все сайты, которые проверяют дату, получают предупреждение php о часовом поясе. Исправление .htaccess не работает. Нужно ли мне запрашивать файл php.ini, создаваемый каждый раз, когда я создаю сайт? Это кажется чрезмерным. Кажется, проблема заключается в том, чтобы оставить предупреждения включенными по умолчанию.

…что также требует, чтобы в настройках файлового менеджера cPanel было установлено значение «Показывать скрытые файлы (dotfiles)».

Это было полезно.

Если значение по умолчанию не задано, используется UTC. Вот что я нашел на одном сервере.

Для другого было установлено значение Германия/Берлин!

Я обновил php.ini, но phpinfo() не обновлялся даже при нажатии F5, пока я не перезапустил apache. Затем я зашел в приложение, и время отображалось правильно.

как я могу изменить часовой пояс на западную африку, как в нигерии,

я не нашел его в списке часовых поясов

В PHP нет часового пояса конкретно для Нигерии, но есть часовой пояс для Лагоса.

Я установил date.timezone = «America/New_York» в моем php.ini и установил его рекурсивно в моем .htaccess.. Лос-Анджелес все еще отображается на моей странице phpinfo.

Спасибо, что связались с нами. Вы добавили настройку в начало файла php.ini?

Можете ли вы предоставить ссылку на свой сайт для тестирования?

Спасибо,
Джон-Пол

Спасибо, мне помогло...

BR из Индонезии

ОТЛИЧНО! Теперь он работает с моим часовым поясом! Большое спасибо!

С наилучшими пожеланиями из Бразилии! 😀

Я хотел бы знать, как автоматически вернуться на главную страницу через 3 секунды после отправки данных. Я пытался с заголовком, но он идет вперед и назад. Пожалуйста, проведите меня через это. Большое спасибо за ваше время.

К сожалению, поддержка программирования выходит за рамки нашей поддержки. Проконсультируйтесь с разработчиком или на форуме, который поможет с программированием решения, отвечающего вашим потребностям.

С уважением,
Арнел С.

Предупреждение: session_start() [function.session-start]: небезопасно полагаться на системные настройки часового пояса. Вам *обязательно* использовать настройку date.timezone или функцию date_default_timezone_set(). Если вы использовали какой-либо из этих методов и все еще получаете это предупреждение, вы, скорее всего, ошиблись в идентификаторе часового пояса. Мы выбрали «Америка/Лос-Анджелес» для «PDT/-7.0/DST» вместо этого в /home/uscold/public_html/mo/membersOnly.php в строке 6

Предупреждение: session_start() [function.session-start]: open(/tmp/sess_e079720753ff740ed0a801cea301a3d3, O_RDWR) не удалось: разрешение отклонено (13) в /home/uscold/public_html/mo/membersOnly.php в строке 6

Я попытался добавить строку в php.ini для часового пояса, как указано на этой странице, но по-прежнему получаю эти ошибки. Можете ли вы указать мне решение? Спасибо. (Я не разбираюсь в php, кроме очень простых основ)

Вы также должны убедиться, что ваш файл php.ini является рекурсивным. Это должно решить вашу проблему.

С наилучшими пожеланиями,
Скотт М

Если время, когда данные регистрируются в вашей БД, соответствует времени по Гринвичу (пример: ), то вы можете сделать довольно простое преобразование в соответствии со смещением по Гринвичу, добавив или вычтя час (например, 3600 секунд в час, если регистрируется с использованием временной метки Unix).

Что касается дальнейших записей в БД, я бы рекомендовал использовать тот же метод, который использовался до этого момента, если не требуется обновление. В этом случае измените соответствующие точки данных, чтобы они совпадали по своему усмотрению, и для всех предыдущих данных используйте сценарий преобразования.

Для этого теста можно использовать простую логику для создания преобразователя.

// добавляем строки по мере необходимости в зависимости от смещения UTC

Я попробовал, и он изменился в моем файле php.ini, но всякий раз, когда я отправлял данные в свою базу данных, время в моей базе данных все еще не менялось. большое спасибо за ваше время.

Если вы используете любую форму шаблонов PHP, это все равно должно работать, если разместить его в верхней части страницы шаблона (или в верхней части каждой страницы, на которой это необходимо): ini_set("date.timezone", "America/ Лос_Анжелес”);

Это гарантирует, что он останется таким, каким он нужен вашему скрипту, и это просто изменение только для вашего скрипта(ов).

Я хотел бы знать, как изменить часовой пояс на общем сервере. Спасибо

Спасибо, что связались с нами. Приведенное выше руководство объясняет именно это. Удалось ли вам выполнить указанное выше руководство?

Были ли у вас проблемы с определенным шагом?

Спасибо,
Джон-Пол

спасибо за помощь.

Я использую этот ключ в opencart, смена часового пояса не удалась.

Это был бы другой способ использовать/установить это >

e cho "Невозможно установить часовой пояс."; // Вы также можете отправить в другую переменную для отображения в другом месте.

Это если вы использовали метод шаблонов PHP, с помощью которого вы использовали одну и ту же страницу шаблона на всем своем сайте. Это должно быть в самом верху, чтобы убедиться, что вы проверили настройку и изменили ее на желаемый часовой пояс.

содержит всю необходимую информацию

Как найти файл php.ini в файловом менеджере?? не нашел

Спасибо за ваше предложение. Я рассмотрю эту статью и решу, поможет ли видео установить часовой пояс для PHP в php.ini.

Если у вас есть дополнительные вопросы, задавайте их ниже.
Спасибо,

Спасибо за вопрос. Поскольку я не смог найти вашу учетную запись у нас, вот некоторая справочная информация о файле php.ini. Это из нашего руководства по обновлению локальных настроек php.

Только пользователи, работающие на сервере с PHP, загруженным как «модуль CGI», будут иметь файл php.ini. Файл php.ini по умолчанию будет расположен по адресу public_html/php.ini. Если вы не видите файл с именем php.ini в вашем public_html, обратитесь в нашу службу поддержки и попросите создать его для вас.

Если у вас есть дополнительные вопросы, задавайте их ниже.
Спасибо,

Убедитесь, что после того, как вы сделали это, остановите apache и перезапустите apache… Что ж, выключите веб-сервер и перезапустите его снова, чтобы php уловил изменение часового пояса.

Спасибо за ваш комментарий. Но при смене часового пояса перезапускать сервер не обязательно.

Вы также не сможете сделать это в настройках общих серверов, так как это приведет к отключению всех сайтов.

Если у вас есть дополнительные вопросы, задавайте их ниже.
Спасибо,

Читайте также: