построение функции часового пояса в PHP веб-приложении - PullRequest
3 голосов
/ 27 апреля 2009

Этот вопрос почти похож на этот: -

Работа с часовыми поясами в PHP

Я прочитал эту ветку и у меня возникли некоторые проблемы, и я не уверен, как элегантно построить поддержку часовых поясов в приложении PHP / MySQL.

Я пишу приложение на PHP, где пользователи могут выбирать свой часовой пояс.

Здесь все метки времени сохраняются в GMT в MySQL. И я преобразовываю часовой пояс обратно в часовой пояс пользователя, когда представляю данные.

Теперь вот проблемы, с которыми я сталкиваюсь: -

1) Я показываю пользователю список часовых поясов, заполненных таблицами часовых поясов MySQL, это ОГРОМНЫЙ список, из которого трудно выбрать.

Итак, я хочу реализовать что-то вроде списка часовых поясов Windows. Смещение с информацией о регионе.

2) PHP и MySQL могут иметь разные наборы списков.

3) Где я должен конвертировать часовые пояса, в PHP или в MySQL? У меня есть комбинация кодирования. Иногда легко выбрать столбец, преобразованный из MySQL, иногда легко преобразовать в PHP. Итак, здесь предыдущий пункт становится очень важным. Например, в таблицах time_zone MySQL Там были Азия / Калькутта и Азия / Калькутта, но в timezonedb по умолчанию в PHP 5.2.6 присутствует только Азия / Калькутта.

Ответы [ 3 ]

5 голосов
/ 28 апреля 2009

Когда я столкнулся с этой конкретной проблемой, я обнаружил эту ссылку , которая отображает краткий список часовых поясов в стиле Windows в подмножество смехотворно исчерпывающего списка часовых поясов в стиле Unix.

Пользователям предоставляется выпадающий список этих имен в стиле Windows (например, (GMT-05: 00) по восточному времени (США и Канада)), и их выбор сохраняется в БД в формате Unix-стиля (например, Америка / New_York)

Работа по применению предпочтения часового пояса пользователя выполняется в PHP во время отображения с использованием класса DateTime . Думаю, я бы порекомендовал это, чтобы вы могли быть уверены, что даты, которыми вы манипулируете в SQL / PHP, всегда указаны в UTC, пока они не отобразятся.

4 голосов
/ 27 апреля 2009
  1. Выбор часового пояса из большого списка не так уж и сложен. Сортируйте список по смещению по стандартному времени, чтобы пользователи могли быстро перейти к правильному смещению и оттуда искать их точное местоположение.

  2. Выберите один список. Я бы предпочел пойти на тот список, который короче. Только представьте эти варианты пользователю.

  3. Сделайте математику, где список был выбран. Если вы представляете список MySQL, попросите MySQL вычислить дату, если вы используете список PHP, пусть PHP выполнит математику. Это сделает так, что вам не нужно будет искать какие-то странные сопоставления для отсутствующих зон в одной реализации.

Причудливое решение может включать запрос местоположения пользователя и экстраполяцию его часового пояса. (Тем не менее, есть возможность явно установить его)

0 голосов
/ 28 апреля 2009

В такой ситуации пользовательский класс может быть лучшим решением. Затем вы можете перемещать время и даты с их часовыми поясами. К счастью, PHP v5 имеет именно такой встроенный объект. Вам просто нужно не забывать кодировать вещи, чтобы, когда вы полагались на неявный часовой пояс, это происходило потому, что вы знаете, что ранее устанавливали его явно. Это также означает, что если вы не знаете, что такое неявное значение, вы спрашиваете, фактически делая его явным.

Если посмотреть на поддержку часовых поясов в PHP и поддержку часовых поясов в MySQL, я бы делал вещи с часовыми поясами в основном на PHP. Поддержка MySQL в значительной степени ориентирована на концепцию «сейчас».

О, да: вы не хотите сделать арифметику с явной датой (например, добавив 86400 секунд, чтобы добавить «один день»). Пусть PHP объект или библиотеки делают это. У них будут исправлены ошибки, о которых вы даже не подумали. (Однажды я написал объект для специализированного типа манипулирования датами и провел недели, борясь с периодически возникающей ошибкой на один час, пока не обнаружил единственное место, которое добавляло 86400 для перехода на один день вместо использования mktime(). Оказалось, что правила перехода на летнее время все портят. Что, конечно, я не проверял.)

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