PHP и MySQL: преобразование сохраненного TIMESTAMP в локальный часовой пояс пользователя

Поэтому у меня есть сайт с функцией комментариев, где временная метка комментария хранится в базе данных MySQL. Насколько я понимаю, временная метка преобразуется в UTC при сохранении, а затем возвращается обратно в часовой пояс по умолчанию при восстановлении. В моем случае мой сервер находится в часовом поясе Central Daylight Time (CDT).

У меня есть план, чтобы получить часовой пояс от каждого пользователя через форму ввода. Я просто хотел узнать, как преобразовать значение TIMESTAMP в часовой пояс пользователя.

  • Во-первых, я бы конвертировал из UTC в местный часовой пояс? Или CDT в местный часовой пояс?
  • Во-вторых, как я буду заниматься этим в PHP? Я бы просто сделал:
 $ userTimezone = новый DateTimeZone ($ userSubmittedTimezoneString);
 $ myDateTime = new DateTime ($ storedTimestamp, $ userTimezone);

… или это не так?

    Значения даты / времени / даты и времени хранятся в MySQL по мере их поставки. Т.е. если вы 2012-04-17 12:03:23 строку 2012-04-17 12:03:23 в столбец DATETIME , это значение, которое будет сохранено. Он будет преобразован внутренне в метку времени, которая может быть или не быть точным (см. Ниже), но когда вы снова запрашиваете значение, вы получите то же самое значение; кругооборот прозрачен.

    Проблемы могут возникнуть, если вы попытаетесь выполнить вычисления времени внутри SQL. Т.е. любая операция, требующая SQL для учета часового пояса и / или времени сервера. Например, используя NOW() . Для любой из этих операций время часового пояса и / или время сервера должны быть установлены правильно. См. Проблемы с часовым поясом .

    Если это вас не касается, и вам нужно всего лишь выполнять вычисления на PHP, вам нужно только убедиться, что вы знаете, из какого часового пояса вы хотите конвертировать часовой пояс. Для этой цели может быть удобнее стандартизировать все время UTC, но это необязательно, поскольку изменения часового пояса из любого часового пояса в любой другой часовой пояс работают так же хорошо, если вы четко понимаете, в каком часовом поясе вы переходите от и к.

     date_default_timezone_set('Asia/Tokyo'); // your reference timezone here $date = date('Ymd H:i:s'); /* INSERT $date INTO database */; $date = /* SELECT date FROM database */; $usersTimezone = new DateTimeZone('America/Vancouver'); $l10nDate = new DateTime($date); $l10nDate->setTimeZone($usersTimezone); echo $l10nDate->format('Ymd H:i:s'); 

    Нет надежного способа получить часовой пояс пользователя. Информация о часовом поясе не отправляется в заголовках HTTP. Лучшее, что вы можете сделать, это либо:

    1. Сопоставьте IP-адрес с географической базой данных -или-
    2. Используйте Javascript, чтобы установить время, установленное на компьютере пользователя, и отправить его на сервер (AJAX) или создать временную строку на клиенте.
     $timezone = new DateTimeZone('America/Vancouver'); $date = new DateTime(date('m/d/Y h:i:s a', time())); $date->setTimeZone($timezone); echo $date->format('l F j Y g:i:s A')."\n"; - $timezone = new DateTimeZone('America/Vancouver'); $date = new DateTime(date('m/d/Y h:i:s a', time())); $date->setTimeZone($timezone); echo $date->format('l F j Y g:i:s A')."\n"; 

    Замените new DateTime(date('m/d/Y h:i:s a', time())); с new DateTime("UTC Time");

    Вы можете создать новый объект DateTimeZone() для каждого пользовательского ввода.

    Способ сделать это с помощью javascript. Я думаю, что лучший способ сделать это – сохранить пользователей GMT в своих файлах cookie и получить их в форме процесса PHP.

     <script language="javascript"> function TimeZoneCookie() { var u_gmt = (-(new Date().getTimezoneOffset()))/60; var o_date = new Date("December 31, 2025"); var v_cookie_date = o_date.toGMTString(); var str_cookie = "utimezone="+u_gmt; str_cookie += ";expires=" + v_cookie_date; document.cookie=str_cookie; } //--------------------- TimeZoneCookie(); </script> 

    u_gmt объяснил:

    1. Date().getTimezoneOffset() возвращает смещение в GMT-0 в минутах
    2. Поскольку getTimezoneOffset() вернет смещение к GMT-0, а не по GMT-0, нам нужно будет повернуть его. Как? просто, зная, что -*-=+ & -*+=- . Если вы знаете основную математику, вы уже знаете этот принцип.
    3. Как я сказал в шаге 1, getTimezoneOffset() вернет смещение в минутах, поэтому мы просто разделим его на 60, поэтому мы можем получить формат смещения gmt.

    Результат: (-(new Date().getTimezoneOffset()))/60


    Теперь извлеките файл cookie в PHP:

     <?php $user_timezone = $_COOKIE['utimezone']; ?>