Преобразование времени и даты из одного часового пояса в другой в PHP
В основном мне нужен script, который, когда время и часовой пояс могут возвращать время в другом часовом поясе.
Мои главные проблемы:
- Где получить смещение по времени от GMT - существует ли для этого общедоступная база данных?
- Как также учитывать различия летнего времени (DST).
- Как красиво обернуть все это внутри класса PHP - или существует ли такой класс уже доступный?
Ответы
Ответ 1
<?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";
?>
Вышеприведенные примеры выводят:
2000-01-01 00:00:00+12:00
2000-01-01 01:45:00+13:45
найдено на Руководство DateTime на php.net
EDIT:
Как сказал Пекка: Класс DateTime существует от 5.2, и вам сначала нужно выяснить, какой из методов реально реализован и какой из них существует только от 5.3.
Ответ 2
попробуйте это, это может помочь :)
function converToTz($time="",$toTz='',$fromTz='')
{
// timezone by php friendly values
$date = new DateTime($time, new DateTimeZone($fromTz));
$date->setTimezone(new DateTimeZone($toTz));
$time= $date->format('Y-m-d H:i:s');
return $time;
}
Немного описания:
Функция принимает 3 входа, время для преобразования, часовой пояс для преобразования, текущий часовой пояс и возвращает выходные данные в указанном формате.
Ответ 3
Я знаю, что уже поздно. Для тех, кому нужна простая функция для преобразования utc в любой локальный часовой пояс
function UTCTimeToLocalTime($time, $tz = '', $FromDateFormat = 'Y-m-d H:i:s', $ToDateFormat = 'Y-m-d H:i:s')
{
if ($tz == '')
$tz = date_default_timezone_get();
$utc_datetime = DateTime::createFromFormat($FromDateFormat, $time, new
DateTimeZone('UTC'));
$local_datetime = $utc_datetime;
$local_datetime->setTimeZone(new DateTimeZone($tz));
return $local_datetime->format($ToDateFormat);
}
echo UTCTimeToLocalTime('2015-07-01 13:30:00','America/Denver');
Ответ 4
Здесь я использую эту функцию для преобразования даты и времени в другой часовой пояс.
Для достижения наилучшего результата, если вы конвертируете свое время и время в часовую зону utc, а затем конвертируете в требуемый часовой пояс, тогда это лучший результат для него.
function ConvertTimezoneToAnotherTimezone($time, $currentTimezone, $timezoneRequired) {
$dayLightFlag = false;
$dayLgtSecCurrent = $dayLgtSecReq = 0;
$system_timezone = date_default_timezone_get();
$local_timezone = $currentTimezone;
date_default_timezone_set($local_timezone);
$local = date("Y-m-d H:i:s");
/* Uncomment if daylight is required */
// $daylight_flag = date("I", strtotime($time));
// if ($daylight_flag == 1) {
// $dayLightFlag = true;
// $dayLgtSecCurrent = -3600;
// }
date_default_timezone_set("GMT");
$gmt = date("Y-m-d H:i:s ");
$require_timezone = $timezoneRequired;
date_default_timezone_set($require_timezone);
$required = date("Y-m-d H:i:s ");
/* Uncomment if daylight is required */
// $daylight_flag = date("I", strtotime($time));
// if ($daylight_flag == 1) {
// $dayLightFlag = true;
// $dayLgtSecReq = +3600;
// }
date_default_timezone_set($system_timezone);
$diff1 = (strtotime($gmt) - strtotime($local));
$diff2 = (strtotime($required) - strtotime($gmt));
$date = new DateTime($time);
$date->modify("+$diff1 seconds");
$date->modify("+$diff2 seconds");
if ($dayLightFlag) {
$final_diff = $dayLgtSecCurrent + $dayLgtSecReq;
$date->modify("$final_diff seconds");
}
$timestamp = $date->format("Y-m-d H:i:s ");
return $timestamp;
}
Спасибо.