Дта и время на сайте для разных стран

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Дта и время на сайте для разных стран

Сообщение Demon_id »

Есть социальная сеть, пользователи которой могут быть из разных стран.
Как сделать так, чтобы каждому пользователю показывалось его время в метках времени на сайте?
Есть ли возможность хранить время записей в одном часовом поясе (полагаю что в нулевом), а при использовании его конвертировать в часовой пояс пользователя?
Может у пхп и mysql есть стандартные средства для этого? или в Yii?
roma276
Сообщения: 5
Зарегистрирован: 2013.07.11, 19:31

Re: Дта и время на сайте для разных стран

Сообщение roma276 »

Ну если хранить - то timestamp with timezone. А еще можно на сервере настраивать таймзону.
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Re: Дта и время на сайте для разных стран

Сообщение Demon_id »

roma276 писал(а):А еще можно на сервере настраивать таймзону.
Она разная для пользователей из разных стран.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Дта и время на сайте для разных стран

Сообщение samdark »

Везде сделать timestamp и UTC+0. На клиенте http://momentjs.com
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Re: Дта и время на сайте для разных стран

Сообщение Demon_id »

Sam Dark писал(а):Везде сделать timestamp и UTC+0. На клиенте http://momentjs.com
Спасибо.
А как это реализовано в социалках vk, facebook, linkedin? Не подкинете ссылок на статьи или хотя бы ключевых фраз что искать в гугле?
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: Дта и время на сайте для разных стран

Сообщение Yiivgeny »

Да ну, есть же нормальные серверные решения. Которые правильно решают проблемы как и чтения, так и записи (в отличие от js решений).

Первый способ.

Если хранить в базе unix_timestamp в int поле, то будет необходимо для всех преобразований времени и дат использовать DateTime объект + в момент инициализации пользователя (в сессии, например) выставлять временную зону по умолчанию в значение пользовательского часового пояса.

Код: Выделить всё

//Эмуляция записи (у пользователя из москвы уже 2011 год)
    //Выставляем пользователю в момент инициализации его родную зону
    $userTimezone = 'Europe/Moscow';//Yii::app()->getUser()->getTimezone();
    date_default_timezone_set($userTimezone);
    //Берём введенное пользователем время и записываем его в базу как raw unixtime
    $Date = new DateTime('2011-01-01 02:15:13');            
    $timestamp = $Date->getTimestamp();//$Post->added = $Date->getTimestamp();

Код: Выделить всё

//Эмуляция чтения (у пользователя из Денвера до нового года еще долго)            
    $userTimezone = 'America/Denver';//Yii::app()->getUser()->getTimezone();
    $Date = DateTime::createFromFormat('U', $timestamp);
    //Выставляем зону пользователя
    $Date->setTimezone(new DateTimeZone($userTimezone));
    echo $Date->format('Y-m-d H:i');//2010-12-31 16:15
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: Дта и время на сайте для разных стран

Сообщение Yiivgeny »

Понятное дело, что надо это всё в обёрточку положить красивую, чтобы всё выставлялось автоматически. Например, сделать из DateTime ApplicationComponent.
Yiivgeny
Сообщения: 80
Зарегистрирован: 2010.11.24, 10:39

Re: Дта и время на сайте для разных стран

Сообщение Yiivgeny »

Второй способ.

Все даты для которых важны пояса должны содержаться в полях типа TIMESTAMP. Выдержка из мануала:
MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval.
Затем всё просто: чтение и запись происходят как обычно, добавляется только маленький нюанс.

Код: Выделить всё

//После инициализации пользователя выполняем запрос к БД.
$userTimezone = 'America/Denver';//Yii::app()->getUser()->getTimezone();
Yii::app()->getDb()->createCommand('SET time_zone = :tz')->bindValue('tz', $userTimezone)->execute();
Ответить