Как конвертировать строку даты / времени (например, 2011-01-01 15:00:00), которая является UTC для любых поддерживаемых php-фраз, таких как America / New_York или Europe / San_Marino.
Объект DateTime
PHP довольно гибкий.
$UTC = new DateTimeZone("UTC"); $newTZ = new DateTimeZone("America/New_York"); $date = new DateTime( "2011-01-01 15:00:00", $UTC ); $date->setTimezone( $newTZ ); echo $date->format('Ymd H:i:s');
Объект DateTime
PHP довольно гибкий.
Поскольку пользователь запросил более одного часового пояса, вы можете сделать его общим.
Общая функция
function convertDateFromTimezone($date,$timezone,$timezone_to,$format){ $date = new DateTime($date,new DateTimeZone($timezone)); $date->setTimezone( new DateTimeZone($timezone_to) ); return $date->format($format); }
Применение:
echo convertDateFromTimezone('2011-04-21 13:14','UTC','America/New_York','Ymd H:i:s');
Вывод:
2011-04-21 09:14:00
Предполагая, что UTC не включен в строку, тогда:
date_default_timezone_set('America/New_York'); $datestring = '2011-01-01 15:00:00'; //Pulled in from somewhere $date = date('Ymd H:i:s T',strtotime($datestring . ' UTC')); echo $date; //Should get '2011-01-01 10:00:00 EST' or something like that
Или вы можете использовать объект DateTime.
function _settimezone($time,$defaultzone,$newzone) { $date = new DateTime($time, new DateTimeZone($defaultzone)); $date->setTimezone(new DateTimeZone($newzone)); $result=$date->format('Ymd H:i:s'); return $result; } $defaultzone="UTC"; $newzone="America/New_York"; $time="2011-01-01 15:00:00"; $newtime=_settimezone($time,$defaultzone,$newzone);
Функция нормализации общего назначения для форматирования любой временной метки из любого часового пояса в другой. Очень полезно для хранения datetimestamps пользователей из разных часовых поясов в реляционной базе данных. Для сравнения баз данных gmdate('Ymd H:i:s')
метку времени как UTC и используйте с gmdate('Ymd H:i:s')
/** * Convert Datetime from any given olsonzone to other. * @return datetime in user specified format */ function datetimeconv($datetime, $from, $to) { try { if ($from['localeFormat'] != 'Ymd H:i:s') { $datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Ymd H:i:s'); } $datetime = new DateTime($datetime, new DateTimeZone($from['olsonZone'])); $datetime->setTimeZone(new DateTimeZone($to['olsonZone'])); return $datetime->format($to['localeFormat']); } catch (\Exception $e) { return null; } }
Применение:
$from = ['localeFormat' => "d/m/YH:i A", 'olsonZone' => 'Asia/Calcutta']; $to = ['localeFormat' => "Ymd H:i:s", 'olsonZone' => 'UTC']; datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"
Как насчет:
$timezone = new DateTimeZone('UTC'); $date = new DateTime('2011-04-21 13:14', $timezone); echo $date->format;