Есть социальная сеть, пользователи которой могут быть из разных стран.
Как сделать так, чтобы каждому пользователю показывалось его время в метках времени на сайте?
Есть ли возможность хранить время записей в одном часовом поясе (полагаю что в нулевом), а при использовании его конвертировать в часовой пояс пользователя?
Может у пхп и mysql есть стандартные средства для этого? или в Yii?
Дта и время на сайте для разных стран
Re: Дта и время на сайте для разных стран
Ну если хранить - то timestamp with timezone. А еще можно на сервере настраивать таймзону.
Re: Дта и время на сайте для разных стран
Она разная для пользователей из разных стран.roma276 писал(а):А еще можно на сервере настраивать таймзону.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Дта и время на сайте для разных стран
Везде сделать timestamp и UTC+0. На клиенте http://momentjs.com
Нравится Yii? Давайте сделаем его лучше!.
Re: Дта и время на сайте для разных стран
Спасибо.Sam Dark писал(а):Везде сделать timestamp и UTC+0. На клиенте http://momentjs.com
А как это реализовано в социалках vk, facebook, linkedin? Не подкинете ссылок на статьи или хотя бы ключевых фраз что искать в гугле?
Re: Дта и время на сайте для разных стран
Да ну, есть же нормальные серверные решения. Которые правильно решают проблемы как и чтения, так и записи (в отличие от js решений).
Первый способ.
Если хранить в базе unix_timestamp в int поле, то будет необходимо для всех преобразований времени и дат использовать DateTime объект + в момент инициализации пользователя (в сессии, например) выставлять временную зону по умолчанию в значение пользовательского часового пояса.
Первый способ.
Если хранить в базе 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
Re: Дта и время на сайте для разных стран
Понятное дело, что надо это всё в обёрточку положить красивую, чтобы всё выставлялось автоматически. Например, сделать из DateTime ApplicationComponent.
Re: Дта и время на сайте для разных стран
Второй способ.
Все даты для которых важны пояса должны содержаться в полях типа TIMESTAMP. Выдержка из мануала:
Все даты для которых важны пояса должны содержаться в полях типа 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();