Это почти аналогичный вопрос:
Работа с часовыми поясами в PHP
Я прочитал этот поток и еще несколько вопросов, а не уверен, как изящно построить поддержку часового пояса в приложении PHP / MySQL.
Я пишу приложение на PHP, где пользователи могут выбирать свой часовой пояс.
Здесь все временные метки хранятся в GMT в MySQL. И я преобразую часовой пояс обратно в часовой пояс пользователей при представлении данных.
Теперь это проблемы, с которыми я сталкиваюсь: –
1) Я показываю пользователю список часовых поясов, заполненных таблицами часовых поясов MySQL, это ОГРОМНЫЙ список и его трудно выбрать.
Итак, я хочу реализовать что-то вроде списка часовых поясов Windows. Смещение с информацией о регионе.
2) У PHP и MySQL может быть другой набор списков.
3) Где я должен конвертировать временные интервалы, в PHP или в MySQL? У меня есть комбинация кодирования. Иногда легко выбрать столбец, преобразованный из MySQL, иногда его легко конвертировать в PHP. Итак, здесь предыдущий пункт становится очень важным. Например, в таблицах времени MySQL таблицы Asia / Kolkata и Asia / Calcutta были там, но в PHP 5.2.6 по умолчанию timezonedb присутствует только Asia / Calcutta.
Когда вы столкнулись с этой точной проблемой, я нашел эту ссылку , которая отображает сжатый список часовых поясов в стиле Windows для подмножества смехотворно исчерпывающего списка часовых поясов в стиле Unix.
Пользователям предоставляется раскрывающийся список этих имен в стиле Windows (например, (GMT-05: 00) Eastern Time (США и Канада)), и их выбор хранится в db в формате в стиле unix (например, America / New_York )
Работа по применению предпочтения часового пояса пользователя выполняется в PHP во время отображения, используя класс DateTime . Я думаю, что рекомендую это, поэтому вы можете быть уверены, что даты, которые вы манипулируете в SQL / PHP, всегда находятся в UTC, пока они не отображаются.
Выбор часового пояса из большого списка не так уж сложно. Сортируйте список по стандартным смещениям, чтобы пользователи могли быстро прокручивать до нужного смещения, а оттуда искать точное местоположение.
Выберите один список. Я хотел бы пойти по тому, что список короче. Представьте только эти варианты для пользователя.
Сделайте математику, где выбранный список. Если вы представляете список MySQL, MySQL должен сделать математическую дату, если вы используете список PHP, попросите PHP сделать математику. Это сделает так, что вам не нужно определять какое-то странное отображение для отсутствующих зон в одной реализации.
Причудливое решение может потребовать запроса местоположения пользователя и экстраполяции их часового пояса. (Тем не менее, есть возможность явно установить его также)
Это та ситуация, когда пользовательский класс может быть лучшим решением. Затем вы можете перемещать время и даты со своими часовыми поясами. К счастью, PHP v5 имеет только такой встроенный объект. Вам просто нужно запомнить код, чтобы, когда вы полагаетесь на неявный часовой пояс, это связано с тем, что вы знаете, что раньше я устанавливал его явно. Это также означает, что если вы не знаете, что такое неявное значение, вы спрашиваете, эффективно делая его явным.
Рассматривая поддержку часового пояса PHP и поддержку часового пояса MySQL, я бы делал время в основном в PHP. Поддержка MySQL в значительной степени ориентирована на ее концепцию «сейчас».
О да: вы не хотите делать явную арифметику дат (например, добавив 86400 секунд, чтобы добавить «один день»). Пусть это делают объекты или библиотеки PHP. У них будут исправлены ошибки, о которых вы не подумали. (Я однажды написал объект для специализированного типа манипуляции датами и провел недели, борясь с прерывистой ошибкой «один за часом», пока не обнаружил одно место, добавлявшее 86400, чтобы сделать переход на день вместо использования mktime()
. Оказалось, что правила дневного света были беспорядочными. Который, конечно, я не проверял.)