Проблема перехода на летнее время в PHP и SQL - PullRequest
2 голосов
/ 03 сентября 2010

Итак, в моем PHP-коде я делаю выбор часового пояса для пользователя, где у меня есть таблица часовых поясов и значения их часовых сдвигов по Гринвичу.Затем я использую это для добавления к значениям столбца DATETIME всякий раз, когда пользователь выбирает свой часовой пояс в SETTINGS.

Итак, у меня есть две функции: чтение из столбца DATETIME в базе данных и ЗАПИСЬ в столбец DATETIME.Очевидно, во-первых, мне нужно «добавить» разницу часовых поясов, прежде чем показывать ее пользователю (используя DATEADD () в SQL), а во-вторых, мне нужно «вычесть» разницу часовых поясов, прежде чем сохранить ее в базе данных (также используяDATEADD ()).Таким образом, все мои сохраненные часовые пояса находятся в GMT и просматриваются на основе выбора часового пояса пользователя.

Тем не менее, проблема перехода на летнее время является проблемой.Какой подход я должен сделать (будь то на уровне SQL или на уровне PHP), чтобы решить эту проблему?Достаточно ли использования DATEADD () в SQL для обеспечения экономии DAYLIGHT?Я понятия не имею.Пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 03 сентября 2010

В SQL 2008 у вас есть новое время данных DATETIMEOFFSET, которое имеет информацию о часовом поясе как смещение (в отличие от имени часового пояса).С этим типом данных вы можете получить время UTC любого значения, а затем вы можете правильно отобразить его в соответствии с часовым поясом пользователя (который является преобразованием, которое принадлежит коду PHP).Другой вариант - всегда хранить UTC в старом типе данных DATETIME.Что бы вы ни делали, перевод от локального пользователя к UTC и от UTC к локальному пользователю принадлежит при рендеринге в PHP, а не в SQL, поэтому DATEADD не помещается в этот код.PHP DateTime имеет поддержку часовых поясов, которая учитывает переход на летнее время.

0 голосов
/ 03 сентября 2010

Время по Гринвичу не имеет летнего времени, поэтому все сохраненные вами времена не должны содержать летнее время. Перед хранением и поиском вам также необходимо рассчитать переход на летнее время. Только некоторые районы мира используют его.

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

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