Лучшая настройка времени по Гринвичу пользователем | PHP

Мне было интересно, как сделать наилучшую пользовательскую конфигурацию, когда пользователь устанавливает свое собственное время по Гринвичу, например. если пользователь находился в часовом поясе GMT+3 и пользователь устанавливает его через UCP.

Что я сделал, так это каждый вариант в раскрывающемся меню:

<select name="timezone">
    ...
    <option value="-7200">GMT-2</option>
    <option value="-3600">GMT-1</option>
    <option value="0">GMT</option>
    <option value="3600">GMT+1</option>
    <option value="7200">GMT+2</option>
    ...
</select>

Вот так, и когда пользователь выберет его, он добавит значение в его пользовательское поле в базе данных.

На чем я застрял, так это когда сообщение было создано пользователем, оно использует отметку time(), и я использую функцию gmdate(), которая выглядит следующим образом:

while(loop goes here)
{
    $post_time = $row['post_time'] // e.g. 1282165261

    if($row['user_timezone'] > 0)
    {
        $timezone = $post_time-$row['user_timezone'];
    }
    else
    {
        $timezone = $post_time+$row['user_timezone'];
    }
}

Что выводится с этим форматом метки времени:

gmdate("D jS M Y @ g:iA", $timezone);

Но проблема в том, что если я использую что-то ниже GMT, например. GMT-1, GMT-6, меняется на +

Вопрос в том, как лучше всего настроить временные метки на предпочтительное для пользователя время по Гринвичу?


person MacMac    schedule 27.08.2010    source источник
comment
Кстати, смещения часовых поясов также существуют с шагом 30 минут.   -  person Artefacto    schedule 27.08.2010


Ответы (2)


Это бессмысленно.

Вы не должны позволять пользователю выбирать смещение по Гринвичу, иначе:

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

Что вам нужно сделать, так это позволить ему выбрать фактический часовой пояс (например, Europe/Lisbon) из списка.

person Artefacto    schedule 27.08.2010

Проблема в этом:

if($row['user_timezone'] > 0)
{
    $timezone = $post_time-$row['user_timezone'];
}
else
{
    $timezone = $post_time+$row['user_timezone'];
}

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

$timezone = $post_time - abs($row['user_timezone']);

Вы должны просто заменить его на:

$timezone = $post_time - $row['user_timezone'];
person Jasper    schedule 27.08.2010