Как установить настройки времени для разных часовых поясов в PHP?

Я сделал проект с PHP, который должен был работать в моей стране Иран, часовой пояс которого UTC+3:30. Я вставил строку ниже в свои коды:

date_default_timezone_set('Asia/Tehran');

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


person Mohammad Saberi    schedule 30.10.2012    source источник
comment
Слишком мало информации для ответа на этот вопрос. Любому приложению, поддерживающему часовой пояс, необходимо (а) знать часовой пояс каждого пользователя и (б) правильно выполнять все расчеты времени, чтобы учесть разницу между часовыми поясами пользователя и сервера.   -  person Jon    schedule 30.10.2012
comment
Будет полезно установить его на один часовой пояс и использовать его.   -  person Chris    schedule 30.10.2012
comment
моя практика заключается в том, чтобы установить GMT для вашего проекта и установить для каждого пользователя часовой пояс. Таким образом, все пользователи будут видеть дату и время в соответствии со своими часовыми поясами.   -  person Arfeen    schedule 30.10.2012
comment
Подход @Arfeen является лучшим: используйте стандартный часовой пояс UCT для всего внутреннего кода и преобразуйте его в местное время только для пользовательского ввода/вывода. Это значительно намного упрощает работу с пользователями, находящимися в нескольких часовых поясах, а также позволяет избежать всех проблем с часовыми поясами, в которых действует летнее время (не уверен, что это влияет на вас локально, но может повлиять на ваших пользователей в другом месте). (примечание для Арфина - это называется GMT только в том случае, если оно относится к местному часовому поясу Великобритании; когда используется универсальная точка отсчета, оно называется UCT. Хотя GMT и UCT в основном одинаковы)   -  person SDC    schedule 30.10.2012
comment
@Arfeen, спасибо за ценный ответ. Знаете ли вы источник, в котором я могу найти список стран и их значения UTC?   -  person Mohammad Saberi    schedule 30.10.2012
comment
@SDC, можете ли вы сказать мне, какие функции лучше всего подходят для хранения времени UTC по умолчанию и преобразования его в определенный часовой пояс?   -  person Mohammad Saberi    schedule 30.10.2012
comment
@SDC Ах, да. Спасибо за исправление. Я должен назвать это UCT.   -  person Arfeen    schedule 30.10.2012
comment
У @MohammadSaberi timezonedb.com/download есть кое-что для вас, и если вы погуглите, вы сможете найти намного больше.   -  person Arfeen    schedule 30.10.2012


Ответы (2)


Вот как вы можете установить часовой пояс:

<?php
session_start();
if(!isset($_SESSION['timezone']))
{
    if(!isset($_REQUEST['offset']))
    {
    ?>
    <script>
    var d = new Date()
    var offset= -d.getTimezoneOffset()/60;
    location.href = "<?php echo $_SERVER['PHP_SELF']; ?>?offset="+offset;
    </script>
    <?php    
    }
    else
    {
        $zonelist = array('Kwajalein' => -12.00, 'Pacific/Midway' => -11.00, 'Pacific/Honolulu' => -10.00, 'America/Anchorage' => -9.00, 'America/Los_Angeles' => -8.00, 'America/Denver' => -7.00, 'America/Tegucigalpa' => -6.00, 'America/New_York' => -5.00, 'America/Caracas' => -4.30, 'America/Halifax' => -4.00, 'America/St_Johns' => -3.30, 'America/Argentina/Buenos_Aires' => -3.00, 'America/Sao_Paulo' => -3.00, 'Atlantic/South_Georgia' => -2.00, 'Atlantic/Azores' => -1.00, 'Europe/Dublin' => 0, 'Europe/Belgrade' => 1.00, 'Europe/Minsk' => 2.00, 'Asia/Kuwait' => 3.00, 'Asia/Tehran' => 3.30, 'Asia/Muscat' => 4.00, 'Asia/Yekaterinburg' => 5.00, 'Asia/Kolkata' => 5.30, 'Asia/Katmandu' => 5.45, 'Asia/Dhaka' => 6.00, 'Asia/Rangoon' => 6.30, 'Asia/Krasnoyarsk' => 7.00, 'Asia/Brunei' => 8.00, 'Asia/Seoul' => 9.00, 'Australia/Darwin' => 9.30, 'Australia/Canberra' => 10.00, 'Asia/Magadan' => 11.00, 'Pacific/Fiji' => 12.00, 'Pacific/Tongatapu' => 13.00);
        $index = array_keys($zonelist, $_REQUEST['offset']);
        $_SESSION['timezone'] = $index[0];
    }
}
date_default_timezone_set($_SESSION['timezone']);

//rest of your code goes here
?>

Источник

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

person enenen    schedule 30.10.2012

Попробуй это:

<?php
$fmt = new IntlDateFormatter("fa_IR@calendar=persian", IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'Asia/Tehran', IntlDateFormatter::TRADITIONAL);
echo $fmt->format(time());
?>
person Shafizadeh    schedule 03.08.2015