Intereting Posts

Поддержка часовых поясов пользователей

Я разрешаю своим пользователям добавлять события в мой webapp. Пользователи могут происходить из разных стран мира.

Моя идея состоит в том, чтобы автоматически определить часовой пояс пользователя (используя API IP-адреса) и вставить его в таблицу пользователей (я также позволю им изменить его).

В таблице событий я вставляю дату начала / дату начала события в UTC.

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

Это считается хорошей практикой или есть лучший способ сделать это?

Что я должен знать об этом?

Благодаря,

Solutions Collecting From Web of "Поддержка часовых поясов пользователей"

Да, это действительно хороший способ. Также имейте в виду, что, если вы используете тип 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'); 

Какой бы метод вы ни использовали, вы всегда должны знать об этих фактах:

  • Временные точки подключения PHP и MySQL всегда должны быть установлены на одно и то же значение, чтобы они соответствовали друг другу
  • Как правило, неплохо смешивать типы TIMESTAMP и DATETIME друг с другом
  • Если вы используете тип TIMESTAMP , установите часовой пояс в часовой пояс пользователя
  • Если вы используете тип DATETIME , установите часовой пояс для UTC и обработайте изменения в часовом поясе в PHP

Мало того, что я бы подумал:

  • Предоставьте пользователям возможность установить часовой пояс вручную.
  • Предполагая, что ваши пользователи могут изменить свое местоположение, дайте им указать часовой пояс для добавляемого события (или местоположение, если вы можете получить от него время zome).

Таким образом, мы надеемся, что они ничего не пропустят 🙂 Удачи вам в вашем webapp!