Подтвердить что ты не робот

Преобразование времени и даты из одного часового пояса в другой в PHP

В основном мне нужен script, который, когда время и часовой пояс могут возвращать время в другом часовом поясе.

Мои главные проблемы:

  • Где получить смещение по времени от GMT - существует ли для этого общедоступная база данных?
  • Как также учитывать различия летнего времени (DST).
  • Как красиво обернуть все это внутри класса PHP - или существует ли такой класс уже доступный?
4b9b3361

Ответ 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;
}

Спасибо.