PHP, MySQL и часовые пояса

Я пытаюсь интегрировать систему часовых поясов в свое приложение, до сих пор я очень старался избегать создания приложений, учитывающих часовые пояса, но сейчас это обязательное требование, поэтому у меня нет выбора. Часовые пояса это просто пролетает над моей головой. Я прочитал несколько тем на PHP.net, а также на других сайтах, включая SO, но не ограничиваясь им. Но я так и не смог это освоить.

Так что мне было интересно, может ли кто-нибудь помочь мне здесь :( Что я ' Я хочу сделать это предпочтительный вариант в моем приложении, позволяющий пользователям выбирать свои собственные часовые пояса из меню выбора, но приложение также должно иметь возможность УСТАНОВИТЬ / Выбрать летнее время соответственно для каждого пользователя.

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


Редактировать за вознаграждение:

Я Я добавляю награду за этот вопрос, потому что я действительно считаю, что нам нужен хороший канонический вопрос о часовых поясах при написании приложений PHP / MySQL (поэтому я также добавляю тег MySQL). Я нашел вещи из многих мест, но было бы хорошо собрать все это вместе. Ответ Чарльза великолепен, но я все еще чувствую, что этого немного не хватает. Вот некоторые вещи, о которых я подумал:

  • Как сохранить время в базе данных из объекта PHP DateTime
  • Должны ли они храниться в DATETIME или TIMESTAMP ? Каковы преимущества или предостережения для каждого?
  • Нужно ли нам когда-нибудь беспокоиться о часовых поясах с MySQL DATE ?
  • Как вставлять значения с помощью NOW () . Нужно ли их как-то преобразовать до или после вставки?
  • Нужно ли устанавливать часовой пояс, используемый MySQL? Если да, то как? Следует ли это делать постоянно или при каждом HTTP-запросе? Должен ли он быть установлен на UTC или может быть что-то еще? Или серверного времени достаточно?
  • Как получить значения из MySQL и преобразовать их в объект DateTime . Поместим его прямо в DateTime :: __construct () достаточно, или нам нужно использовать DateTime :: createFromFormat () ?
  • Когда преобразовывать в местное время и почему. Есть ли время, когда мы хотели бы преобразовать его до того, как он будет возвращен пользователю (например, для сравнения с другим объектом DateTime или статическим значением)?
  • Есть ли когда-нибудь время, которое нам нужно беспокоиться о переходе на летнее время (DST)? Почему или почему нет?
  • Что делать, если они ранее вставляли данные (например, с помощью NOW () ), не беспокоясь о часовом поясе, чтобы все оставалось согласованным?
  • Что-нибудь еще вы подумайте о том, что кто-то должен обратить внимание на

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

22
задан Mike 5 March 2013 в 04:54
поделиться