Конвертировать время и дату из одного часового пояса в другой в PHP - PullRequest
41 голосов
/ 11 октября 2010

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

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

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

Ответы [ 4 ]

84 голосов
/ 11 октября 2010
<?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

РЕДАКТИРОВАТЬ: Как сказал Пекка: Класс DateTimeсуществует с версии 5.2 и там сначала нужно выяснить, какие из методов реально реализованы, а какие существуют только с версии 5.3.

5 голосов
/ 20 апреля 2016

попробуйте, это может помочь:)

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;
    }
0 голосов
/ 24 марта 2018

Я знаю, что уже поздно.Для тех, кому нужна простая функция для преобразования 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');
0 голосов
/ 26 июля 2013

Здесь я использую эту функцию для преобразования даты и времени в другой часовой пояс. Для наилучшего результата, если вы конвертируете дату и время в часовой пояс 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;
}

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...