Может ли кто-нибудь предложить простой способ конвертировать дату и время в разные временные интервалы в php?
Преобразование временной зоны в php
Ответ 1
Для этого можно использовать объект datetime или их псевдонимы функций:
Пример (сокращенно из руководства PHP)
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 12:35:23');
echo $datetime->format('Y-m-d H:i:s') . "\n";
$la_time = new DateTimeZone('America/Los_Angeles');
$datetime->setTimezone($la_time);
echo $datetime->format('Y-m-d H:i:s');
Изменить комментарии
но я не могу использовать этот метод, потому что мне нужно показать дату в разных часовых поясах в качестве входа пользователя из разных мест.
Это не проблема. Когда пользователь входит в систему, вы определяете его часовой пояс и устанавливаете его в свой объект DateTime, как показано на рисунке. Я использую аналогичный подход в одном из моих проектов, и он работает как прелесть.
в базе данных мне нужно получить даты в любом одном часовом поясе, тогда только это можно обработать правильно
Вы сохраняете время либо как временную метку, либо дату-время в одном часовом поясе. Когда вы запрашиваете поле DateTime, вы либо конвертируете время в объект DateTime в этот часовой пояс, либо - если ваш db поддерживает его - запрос с выбранным часовым поясом.
Ответ 2
Еще более простой способ выглядит следующим образом:
date_default_timezone_set('Europe/London'); // your user timezone
$my_datetime='2013-10-23 15:47:10';
echo date('Y-m-d H:i:s',strtotime("$my_datetime UTC"));
Как описано в руководстве PHP, strtotime() также принимает часовой пояс, вам просто нужно добавить его в свое время.
Я рекомендую вам хранить все ваши даты в UTC, потому что таким образом у вас не будет проблем с летней экономией.
Ответ 3
Это сработало для меня, и это тоже очень чисто!
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);
Ответ 4
DateTime:: setTimezone - date_timezone_set - Устанавливает часовой пояс для объекта DateTime
Объектно-ориентированный стиль
<?php
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";
$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date->format('Y-m-d H:i:sP') . "\n";
?>
Процедурный стиль
<?php
$date = date_create('2000-01-01', timezone_open('Pacific/Nauru'));
echo date_format($date, 'Y-m-d H:i:sP') . "\n";
date_timezone_set($date, timezone_open('Pacific/Chatham'));
echo date_format($date, 'Y-m-d H:i:sP') . "\n";
?>
Вышеприведенные примеры выводят:
2000-01-01 00:00:00+12:00
2000-01-01 01:45:00+13:45
Ответ 5
Ни один из этих ответов не работал у меня (я пропустил сложный код, который был слишком громоздким по размеру). Я также считаю странным изменить часовой пояс по умолчанию только для одного преобразования.
Вот мое решение:
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");
Ответ 6
UTC to local:
<?php
$datetime = date("Y-m-d H:i:s");
$utc = new DateTime($datetime, new DateTimeZone('UTC'));
$utc->setTimezone(new DateTimeZone('America/Sao_Paulo'));
echo $utc->format('Y-m-d H:i:s');
?>
Ответ 7
<?php
$time='6:02';
$dt = new DateTime($time, new DateTimeZone('America/New_York'));
//echo $dt->format('Y-m-d H:i:s') . PHP_EOL;
$dt->setTimezone(new DateTimeZone('Asia/Kolkata'));
echo $dt->format('H:i') . PHP_EOL;
?>
Ответ 8
//Преобразование даты из одной зоны в другую. /* $ Zone_from = 'Asia/Калькутта';
$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("Y-m-d H:i:s");
date_default_timezone_set($cur_zone);
$local = date("Y-m-d H:i:s");
date_default_timezone_set($req_zone);
$required = date("Y-m-d 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("Y-m-d H:i:s");
}