Я разрешаю своим пользователям добавлять события в мой webapp. Пользователи могут происходить из разных стран мира.
Моя идея состоит в том, чтобы автоматически определить часовой пояс пользователя (используя API IP-адреса) и вставить его в таблицу пользователей (я также позволю им изменить его).
В таблице событий я вставляю дату начала / дату начала события в UTC.
Затем, когда мне нужно отображать информацию о событии, я бы взял дату начала / дату начала мероприятия из таблицы и выполнил расчет против часовой пояс пользователя.
Это считается хорошей практикой или есть лучший способ сделать это?
Что я должен знать об этом?
Благодаря,
Да, это действительно хороший способ. Также имейте в виду, что, если вы используете тип TIMESTAMP
в MySQL, MySQL обрабатывает для вас изменение часового пояса. Когда вы вставляете новые даты / время в базу данных, MySQL преобразует ее из часового пояса соединения в UTC ( TIMESTAMP
всегда сохраняется в формате UTC). Когда вы извлекаете поле TIMESTAMP
из базы данных, MySQL преобразует его обратно в часовой пояс соединения.
Поэтому, если вы используете поля TIMESTAMP
в MySQL, все, что вам нужно сделать, это указать часовой пояс пользователя для MySQL в начале каждой вашей страницы. Вы делаете это:
SET time_zone = 'Europe/Helsinki'
Вы также можете использовать цифровые часовые пояса:
SET time_zone = '+02:00'
Имейте в виду, что вам, возможно, потребуется сначала установить tzinfo в MySQL, что является тривиальным (хотя и для нечисловой версии). Вот информация о том, как это сделать: http://dev.mysql.com/doc/refman/5.0/ru/mysql-tzinfo-to-sql.html
Вкратце, это важная часть:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
Вот пример того, как это работает:
mysql> CREATE TEMPORARY TABLE test(foo TIMESTAMP); Query OK, 0 rows affected (0.00 sec) mysql> SET time_zone = '+00:00'; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO test VALUES ('2011-02-03 16:00:00'); Query OK, 1 row affected (0.00 sec) mysql> SET time_zone = '+02:00'; Query OK, 0 rows affected (0.00 sec) mysql> SELECT foo FROM test; +---------------------+ | foo | +---------------------+ | 2011-02-03 18:00:00 | +---------------------+ 1 row in set (0.00 sec)
Если вы не используете поле TIMESTAMP
, например. вы используете DATETIME
(который также поддерживает более широкий диапазон дат), тогда вам просто нужно убедиться, что вы всегда вставляете даты в UTC; Я делаю это, всегда устанавливая часовой пояс соединения на +00:00
. Тогда у вас может быть помощник вида на PHP, который преобразует дату и время в часовой пояс пользователя, что довольно сложно сделать с помощью функции DateTime класса PHP и функции setTimezone . В последней ссылке есть пример. Чтобы использовать этот метод, вы должны убедиться, что PHP также настроен на использование UTC в качестве часового пояса по умолчанию, что вы можете сделать с этим:
date_default_timezone_set('UTC');
Какой бы метод вы ни использовали, вы всегда должны знать об этих фактах:
TIMESTAMP
и DATETIME
друг с другом TIMESTAMP
, установите часовой пояс в часовой пояс пользователя DATETIME
, установите часовой пояс для UTC и обработайте изменения в часовом поясе в PHP Мало того, что я бы подумал:
Таким образом, мы надеемся, что они ничего не пропустят 🙂 Удачи вам в вашем webapp!