совет с датой и временем php - PullRequest
1 голос
/ 02 марта 2012

У нас есть система сражений, где люди могут выбрать время матча, чтобы бросить вызов другому игроку. Чтобы создать совпадение, пользователь должен выбрать дату. В настоящее время пользователь выбирает день, час, минуту и ​​час / час из выпадающего списка. Если пользователь выбирает 20.05.2012 в 13:00, система добавляет часы и минуты с начала дня. Вот быстрый пример, чтобы лучше понять, о чем я говорю:

$time = strtotime('today', $inputdate);
$time = $time + $hours + $minutes;

значение $hours изменяется, если пользователь выбирает AM или PM. Это довольно просто: sample

Все работало нормально, пока у людей не начались проблемы с часовым поясом. Например, если игрок A создает матч в 13:00, то игрок B увидит, что матч начинается в 13:00, но у него / нее будут разные часовые пояса!

Проблема в том, что я не знаю проблемы: /

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

Что у меня есть:

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

Я потерян и не могу решить проблему, я могу написать код, но сейчас я не думаю, что логично. Мне потребовался один час, чтобы написать это и попытаться объяснить, как я мог, так как я сам не знаю, как заставить это работать. Некоторые советы приветствуются.

Мне нужна функция для преобразования метки времени в UTC-5:

function input_date($timestamp)
{
    global $vbulletin;
    $timestamp = (int)$timestamp;

    if (strlen((string)$timestamp) == 10)
    {
        $hour = 3600.00;
        $offset = $vbulletin->userinfo['timezoneoffset'];//sample -8
        $ds = (int)$vbulletin->userinfo['dstonoff'];//DST
        $fluff = $hour*($offset+5.00);
        $timestamp = $timestamp+$fluff+($ds*$hour);

        return $timestamp;//return timestamp in UTC-5 format..
    }
    else
    {
        return 0;
    }
}

1 Ответ

0 голосов
/ 02 марта 2012

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

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

// Player A creates match at 1PM Europe/London
$timezone = 'Europe/London';
$localTime = '2012-03-01 13:00:00';

// work out UNIX timestamp using that timezone (making it timezone independent)
date_default_timezone_set($timezone);
$timestamp = strtotime($localTime);

// store $timestamp in the database

// Player B views the timestamp with timezone America/Los_Angeles
$timezone = 'America/Los_Angeles';

date_default_timezone_set($timezone);
var_dump(date('c', $timestamp)); // see manual for more output formats

Если у вас есть часовые пояса, сохраненные как их сокращения(например, «CET», «GMT»), затем используйте timezone_name_from_abbr, чтобы получить правильное название часового пояса.

...