Может ли кто-нибудь предложить простой способ конвертировать дату и время в разные временные интервалы в php?
Для этого вы можете использовать объект datetime или их псевдонимы функций:
Пример ( сокращенно из руководства PHP )
date_default_timezone_set('Europe/London'); $datetime = new DateTime('2008-08-03 12:35:23'); echo $datetime->format('Ymd H:i:s') . "\n"; $la_time = new DateTimeZone('America/Los_Angeles'); $datetime->setTimezone($la_time); echo $datetime->format('Ymd H:i:s');
Изменить комментарий
но я не могу использовать этот метод, потому что мне нужно показать дату в разных часовых поясах, поскольку пользовательский логин из разных мест
Это не проблема. Когда пользователь входит в систему, вы определяете его часовой пояс и устанавливаете его в свой объект DateTime, как показано на рисунке. Я использую подобный подход в одном из моих проектов, и он работает как шарм.
в базе данных мне нужно получить даты в любой момент времени, тогда только она может быть обработана должным образом
Вы сохраняете время либо как временную метку, либо дату-время в одном часовом поясе. Когда вы запрашиваете поле DateTime, вы либо конвертируете время в объект DateTime в этот часовой пояс, либо – если ваш db поддерживает его – запрос с выбранным часовым поясом.
Еще более простой способ выглядит так:
date_default_timezone_set('Europe/London'); // your user's timezone $my_datetime='2013-10-23 15:47:10'; echo date('Ymd H:i:s',strtotime("$my_datetime UTC"));
Как описано в руководстве PHP , strtotime () также принимает часовой пояс, вам просто нужно добавить его в свое время.
Я рекомендую вам хранить все ваши данные в UTC, потому что таким образом у вас не будет проблем с летней экономией.
Это сработало для меня, и это тоже очень чисто!
function convert_to_user_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC') { try { $dateTime = new DateTime ($date, new DateTimeZone($serverTimeZone)); $dateTime->setTimezone(new DateTimeZone($userTimeZone)); return $dateTime->format($format); } catch (Exception $e) { return ''; } } function convert_to_server_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC') { try { $dateTime = new DateTime ($date, new DateTimeZone($userTimeZone)); $dateTime->setTimezone(new DateTimeZone($serverTimeZone)); return $dateTime->format($format); } catch (Exception $e) { return ''; } } //example usage $serverDate = $userDate = '2014-09-04 22:37:22'; echo convert_to_user_date($serverDate); echo convert_to_server_date($userDate);
DateTime :: setTimezone – date_timezone_set – устанавливает часовой пояс для объекта DateTime
Объектно-ориентированный стиль
<?php $date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru')); echo $date->format('Ymd H:i:sP') . "\n"; $date->setTimezone(new DateTimeZone('Pacific/Chatham')); echo $date->format('Ymd H:i:sP') . "\n"; ?>
Процедурный стиль
<?php $date = date_create('2000-01-01', timezone_open('Pacific/Nauru')); echo date_format($date, 'Ymd H:i:sP') . "\n"; date_timezone_set($date, timezone_open('Pacific/Chatham')); echo date_format($date, 'Ymd H:i:sP') . "\n"; ?>
Вышеприведенные примеры выводят:
2000-01-01 00:00:00+12:00 2000-01-01 01:45:00+13:45
Ни один из этих ответов не работал для меня (я пропустил сложный код, который был слишком громоздким по размеру). Я также думаю, что странно менять часовой пояс по умолчанию только для одного преобразования.
Вот мое решение:
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("Ymd 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");
UTC на локальный:
<?php $datetime = date("Ymd H:i:s"); $utc = new DateTime($datetime, new DateTimeZone('UTC')); $utc->setTimezone(new DateTimeZone('America/Sao_Paulo')); echo $utc->format('Ymd H:i:s'); ?>
<?php $time='6:02'; $dt = new DateTime($time, new DateTimeZone('America/New_York')); //echo $dt->format('Ymd H:i:s') . PHP_EOL; $dt->setTimezone(new DateTimeZone('Asia/Kolkata')); echo $dt->format('H:i') . PHP_EOL; ?>
// Преобразование даты из одной зоны в другую. / * $ Zone_from = 'Азия / Калькутта';
$zone_to='America/Phoenix'; date_default_timezone_set($zone_from); $convert_date="2016-02-26 10:35:00"; echo $finalDate=zone_conversion_date($convert_date, $zone_from, $zone_to); */ function zone_conversion_date($time, $cur_zone, $req_zone) { date_default_timezone_set("GMT"); $gmt = date("Ymd H:i:s"); date_default_timezone_set($cur_zone); $local = date("Ymd H:i:s"); date_default_timezone_set($req_zone); $required = date("Ymd H:i:s"); /* return $required; */ $diff1 = (strtotime($gmt) - strtotime($local)); $diff2 = (strtotime($required) - strtotime($gmt)); $date = new DateTime($time); $date->modify("+$diff1 seconds"); $date->modify("+$diff2 seconds"); return $timestamp = $date->format("Ymd H:i:s"); }