Поэтому у меня есть веб-приложение, написанное на PHP, которое будет работать на разных серверах Ubuntu по всему миру. Некоторые из серверов будут настроены на запуск по местному времени, некоторые из них будут работать в UTC, это зависит от клиента.
Хотя я могу отредактировать файл php.ini и установить date.timezone, вручную ввести такие данные, в один прекрасный день обязательно будет не прав.
Как я могу заставить PHP использовать часовой пояс, уже определенный в системе (tzdata)?
Или, другими словами: Как я могу извлечь (длинное) имя часового пояса из системы в PHP для использования в date_default_timezone_set ()?
Если у вас установлен часовой пояс, вы можете использовать: http://php.net/manual/en/function.date-default-timezone-get.php
Или http://php.net/manual/en/function.timezone-name-from-abbr.php
С помощью того, что Андрей Кнупп дал в своем ответе, я смог решить эту проблему.
echo "Time: " . date("Ymd H:i:s") . "<br>\n"; $shortName = exec('date +%Z'); echo "Short timezone:" . $shortName . "<br>"; $longName = timezone_name_from_abbr($shortName); echo "Long timezone:" . $longName . "<br>"; date_default_timezone_set($longName); echo "Time: " . date("Ymd H:i:s") . "<br>\n";
Дает выход:
Time: 2011-12-23 23:29:45 Short timezone:MYT Long timezone:Asia/Kuala_Lumpur Time: 2011-12-24 06:29:45
Обновление : краткое имя часовых поясов не является уникальным. Например, в Америке и Австралии есть «EST», ведущий timezone_name_from_abbr, чтобы иногда выбирать тот, который я не хочу … Вы можете задать дату, насколько велика величина смещения, и которая может использоваться для дальнейшего соответствия правильный часовой пояс:
$offset = exec('date +%::z'); $off = explode (":", $offset); $offsetSeconds = $off[0][0] . abs($off[0])*3600 + $off[1]*60 + $off[2]; $longName = @timezone_name_from_abbr($shortName, $offsetSeconds);