Работа с часовым поясом в PHP и MySQL - PullRequest
2 голосов
/ 30 августа 2011

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

И наконец, как мне это сделать в PHP. Могу ли я просто сделать «Время - Смещение сервера + Смещение пользователя»?

Ответы [ 4 ]

3 голосов
/ 30 августа 2011

Область и местоположение важны, если вы хотите сохранить все данные.Лучший способ (на мой взгляд) для хранения дат - это сохранить временную метку UTC + местоположение.

Просто смещение может быть достаточно для некоторых вычислений, но этого может быть недостаточно, если у вас есть временная метка, ихочу узнать точное время для чего-то вроде «+1 день».Так как это зависит от страны, в которой действуют разные правила перехода на летнее время.

Поэтому, если вы хотите быть абсолютно уверены, что вы не «теряете информацию» и не можете выполнять расчеты на основе времени в будущем, сохраните UTC.отметка времени и идентификатор olson (например, Европа / Амстердам).

Чтобы ответить на второй вопрос, если у вас есть эти две части информации, вы можете легко восстановить ее с помощью DateTime:

$dt = new DateTime('@' . $timeStamp);
// Now convert it to the users timezone
$dt->setTimeZone(new DateTimeZone('Europe/Berlin'));

// Now you have a 'DateTime' object which you can easily display with the ->format function.

Добавление

Лично я предпочитаю хранить метки времени как целые числа.Тип TIMESTAMP выполняет автоматическое преобразование, и я чувствую, что лучше разрешить PHP-приложению справиться с этим, это имеет особый смысл для того, что я считаю вашим вариантом использования (простая локализация для пользователей).

Использование DATETIME также работает, но требования к хранению намного выше, чем просто использование целого числа.Если вы предпочитаете DATETIME, попробуйте установить в своем приложении правило хранить каждое значение всегда в формате UTC, поскольку не возникает путаницы, особенно в отношении переходов DST и изменений законодательства в вашем часовом поясе.

ЕслиВы просто хотите, чтобы в вашем веб-приложении отображалось время, рассчитанное на основе местного часового пояса пользователя, смещение бесполезно.Смещение изменяется два раза в год для большинства стран, и почти каждый год одна или две страны меняются, когда это происходит.

Местоположение требуется только в том случае, если вы используете потрясающие объекты DateTime и DateTimeZone в PHP.

Последний совет:

Люди, как правило, путают даты и время в приложениях PHP и отправляют эти значения во многих различных форматах (строки, целые и т. Д.) И смешивают GMT и UTC.Попробуйте сделать для себя правилом только когда-либо отправлять объекты DateTime в аргументах функций и возвращаемых значениях, чтобы вы могли вводить подсказки и никогда не возникало никаких сомнений в том, в каком формате находится переменная. Это будет полезноэто.

1 голос
/ 30 августа 2011

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

Когда пользователь при входе сохраняет часовой пояс в $_SESSION['timezone'] Переменная и установите часовой пояс в ваших сценариях, как это:

date_default_timezone_set($_SESSION['timezone']);
0 голосов
/ 02 февраля 2013

Вы упоминаете пользователя.Я предлагаю вам позволить пользователю выбрать его / ее часовой пояс, и вы сохраните его в своей базе данных.

Вот как синхронизировать часовые пояса PHP (> = 5.3) и MySQL для каждого сеанса и пользовательских настроек.Поместите его туда, где он работает, когда вам нужно установить и синхронизировать часовые пояса.

date_default_timezone_set($my_timezone);
$n = new \DateTime();
$h = $n->getOffset()/3600;
$i = 60*($h-floor($h));
$offset = sprintf('%+d:%02d', $h, $i);
$this->db->query("SET time_zone='$offset'");

Где $ my_timezone - один из списка часовых поясов PHP: http://www.php.net/manual/en/timezones.php

Часовой пояс PHP необходимо преобразоватьв смещение часов и минут для MySQL.Это то, что делают строки 1-4.Строка запроса использует платформу Code Igniter, которую вы можете не использовать, но запрос показан в скобках.

0 голосов
/ 30 августа 2011

Если вы имеете дело с MySQL, вы можете использовать информацию о часовом поясе из (mysql_tzinfo_to_sql ), она автоматически идентифицирует время пользователя в соответствии с часовым поясом. И вам нужно создать столбец типа отметка времени , в которой хранится информация о часовом поясе пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...