В настоящее время у меня проблема, которая охватывает мой мозг вокруг понятия преобразования моего времени MySQL в определенный часовой пояс, в зависимости от настроек пользователя.
Все мои времена MySQL хранятся в UTC, в следующем формате:
2009-11-08 17:06:40
Как только я запрошу время, я не совсем уверен, как преобразовать его в соответствующий часовой пояс с помощью PHP.
Таким образом, в приведенном выше примере я хотел бы отобразить:
2009-11-08 09:06:40
Вот что я сейчас имею (что, вероятно, нужно исправлять):
$sql = 'SELECT date FROM mytable'; require("connection.php"); $result = mysql_db_query($DBname,$sql,$link); while($row = mysql_fetch_assoc($result)) { $dt_obj = new DateTime($row['date']); $dt_obj->setTimezone(new DateTimeZone('PST')); echo $dt_obj; echo "<br>"; }
Во-первых, я получаю следующую ошибку:
Catchable fatal error: Object of class DateTime could not be converted to string
Во-вторых, я смущен тем, что я настраиваю его правильно, чтобы отобразить время в правильном часовом поясе в любом случае (в данном случае PST).
Любые предложения о том, как это сделать, будут очень признательны. Благодаря!
ОБНОВИТЬ:
Я взял совет GZipp и изменил код, чтобы он выглядел так:
$dt_obj->setTimezone(new DateTimeZone('America/Los_Angeles')); echo $dt_obj->format('Ymd H:i:s');
Однако он показывает мое время (используя пример сверху) как:
2009-11-08 15:06:40
Какие-нибудь идеи о том, что будет причиной этого?
Я думаю, что это то, что вам нужно;
$dt_obj = new DateTime($row['date']); $dt_obj->setTimezone(new DateTimeZone('America/Los_Angeles')); echo $dt_obj->format('Ymd H:i:s');
Используйте список поддерживаемых часовых поясов .
Обновление редактируемого вопроса. Чтобы убедиться, что PHP видит время из базы данных как время UTC, сделайте что-то вроде этого:
$row['time'] = '2009-11-08 09:06:40'; $dt_obj = new DateTime($row['time'], new DateTimeZone('UTC')); echo 'UTC: ' . $dt_obj->format('Ymd H:i:s') . '<br />'; // UTC: 2009-11-08 09:06:40 $dt_obj->setTimezone(new DateTimeZone('America/Los_Angeles')); echo 'Los Angeles: ' . $dt_obj->format('Ymd H:i:s'); // Los Angeles: 2009-11-08 01:06:40
Возможно, я ошибаюсь, но похоже, что он жалуется на ваш echo $dt_obj;
заявление. Вы можете попробовать повторить результат DateTime :: format ();
EDIT: для вашего нового вопроса я бы предположил, что ваш формат по умолчанию установлен на PST уже, поэтому, когда создается новая дата, он создается с этим часовым поясом, тем самым устанавливая, что часовой пояс ничего не меняет. Вы можете проверить и посмотреть, так ли это. Вы также можете посмотреть date_default_timezone_set('<tz>');