Ни один из этих ответов не сработал для меня (я пропустил попытку использования кода, который был слишком громоздким). Я также думаю, что странно менять часовой пояс по умолчанию только для одного преобразования.
Вот мое решение:
function changeTimeZone($dateString, $timeZoneSource = null, $timeZoneTarget = null)
{
if (empty($timeZoneSource)) {
$timeZoneSource = date_default_timezone_get();
}
if (empty($timeZoneTarget)) {
$timeZoneTarget = date_default_timezone_get();
}
$dt = new DateTime($dateString, new DateTimeZone($timeZoneSource));
$dt->setTimezone(new DateTimeZone($timeZoneTarget));
return $dt->format("Y-m-d H:i:s");
}
Итак, чтобы преобразовать сервер в значение по умолчанию, вам нужно просто передать один часовой пояс:
changeTimeZone("2016-10-24 16:28", "Asia/Tokyo");
Чтобы преобразовать сервер по умолчанию для пользователя, вы должны оставить второй параметр пустым или пустым:
changeTimeZone("2016-10-24 16:28", "", "Asia/Tokyo");
А для переключения между часовыми поясами, не относящимися к значениям по умолчанию, вы должны указать 2 часовых пояса:
changeTimeZone("2016-10-24 16:28", "America/New_York", "Asia/Tokyo");