2011-12-23 8 views
2

Итак, у меня есть веб-приложение, написанное на PHP, которое будет работать на разных серверах Ubuntu по всему миру. Некоторые из серверов будут настроены на запуск по местному времени, некоторые из них будут работать в UTC, это зависит от клиента.Использование настроек часового пояса системы в PHP

Пока я могу редактировать файл php.ini и устанавливать дату.timezone, вручную вводить такие данные в один прекрасный день.

Как я могу заставить PHP использовать часовой пояс, уже определенный в системе (tzdata)?

Или, другими словами: Как я могу извлечь (длинное) имя часового пояса из системы в PHP для использования в date_default_timezone_set()?

ответ

1

Если часовой пояс установлен, вы можете использовать: http://php.net/manual/en/function.date-default-timezone-get.php

Или http://php.net/manual/en/function.timezone-name-from-abbr.php

+0

date_default_timezone_get() не поможет мне, так как ни date.timezone в php.ini установлен, и я не сделал date_default_timezone_set() еще. Но timezone-name-from-abbr() было недостающим звеном, спасибо! – Stoffisimo

4

С помощью что Андрей Knupp дал в своем ответе, я был в состоянии решить эту.

echo "Time: " . date("Y-m-d 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("Y-m-d 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 

Update: Короткое имя для часовых поясов, не являются уникальными. Например, в Америке и Австралии есть «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); 
+0

Спасибо за ваше простое решение. Мне только нужно было дать предварительное предположение для моих пользователей. Для этого приложения не имеет значения, станет ли время sytem значением по умолчанию. Ваша догадка работала очень хорошо. – ndasusers

Смежные вопросы