PHP преобразование времени UTC в местное время

Я получаю время UTC с моего сервера, как в следующем формате, мое требование заключается в преобразовании времени UTC в местное время. Таким образом, пользователи могут видеть удобное время в своем браузере на основе своего часового пояса. Пожалуйста, помогите мне решить эту проблему. Спасибо

$utc = "2014-05-29T04:54:30.934Z"

Я пробовал некоторые методы, но не работает в моем случае

первый

$time = strtotime($utc);
$dateInLocal = date("Y-m-d H:i:s", $time);
echo $dateInLocal;

второй

$time = strtotime($utc .' UTC');
$dateInLocal = date("Y-m-d H:i:s", $time);
echo $dateInLocal;

7 ответов


причина ваш код не работает, скорее всего потому, что ваш сервер по времени UTC. Так что локальное время сервера и UTC.

Решение № 1

одно потенциальное решение-сделать следующую сторону сервера и передать целое число эпохи в браузер:

$utc = "2014-05-29T04:54:30.934Z";
$time = strtotime($utc); //returns an integer epoch time: 1401339270

затем используйте JavaScript для преобразования целого числа эпохи в локальное время пользователя (браузер знает часовой пояс пользователя).

решение № 2

вы можете получить браузер, чтобы отправить вам часовой пояс пользователя. Затем вы можете использовать эту информацию для вычисления строки даты на стороне сервера, а не на стороне браузера. Подробнее здесь:https://stackoverflow.com/a/5607444/276949

Это даст вам смещение пользователя (-7 часов). Вы можете использовать эту информацию для установки часового пояса, посмотрев здесь:преобразование смещения UTC в часовой пояс или дату


просто использовать DateTimeZone, например,

$dt = new DateTime($utc);
$tz = new DateTimeZone('Asia/Kolkata'); // or whatever zone you're after

$dt->setTimezone($tz);
echo $dt->format('Y-m-d H:i:s');

демо ~ http://ideone.com/fkM4ct


просто отправьте время UTC в браузер. Используйте JavaScript для его анализа с помощью


Если это не делается с помощью настройки профиля пользователя, вероятно, проще и проще использовать библиотеку времени javascript, например. момент.js (http://momentjs.com/) для решения этой проблемы (отправьте все даты/времена в UTC, а затем преобразуйте их на клиентском конце).

Javascript например. (Я уверен, что это может быть достигнуто без создания двух объектов момента (исправьте это на досуге).

function utcToLocalTime(utcTimeString){
    var theTime  = moment.utc(utcTimeString).toDate(); // moment date object in local time
    var localTime = moment(theTime).format('YYYY-MM-DD HH:mm'); //format the moment time object to string

    return localTime;
}

пример php для разрешения на стороне сервера (используйте только одно из этих решений, оба вместе произведут неправильное время на клиентском конце)

/**
 * @param $dateTimeUTC
 * @param string $timeZone
 * @param string $dateFormat
 * @return string
 *
 * epoch to datetime (utc/gmt)::
 * gmdate('Y-m-d H:i:s', $epoch);
 */
function dateToTimezone($timeZone = 'UTC', $dateTimeUTC = null, $dateFormat = 'Y-m-d H:i:s'){

    $dateTimeUTC = $dateTimeUTC ? $dateTimeUTC : date("Y-m-d H:i:s");

    $date = new DateTime($dateTimeUTC, new DateTimeZone('UTC'));
    $date->setTimeZone(new DateTimeZone($timeZone));

    return $date->format($dateFormat);
}

#cnvt_usrTime_to_UTC 0

function cnvt_usrTime_to_UTC($dt_start_time_formate,$UTC_TimeZone){

  $LocalTime_start_time = new DateTime( $dt_start_time_formate );
  $tz_start = new DateTimeZone( $UTC_TimeZone );
  $LocalTime_start_time->setTimezone( $tz_start );
  $array_start_time = (array) $LocalTime_start_time;

  return $UTC_Time_Start_Time = $array_start_time['date'];
}

вызов функции cnvt_usrTime_to_UTC ($dt_start_time_formate, 'UTC');

#cnvt_UTC_to_usrTime
function cnvt_UTC_to_usrTime($Date_Time,$User_time_Zone){

    date_default_timezone_set('UTC');

    $LocalTime_start_time = new DateTime( $Date_Time );
    $tz_start = new DateTimeZone( $User_time_Zone );
    $LocalTime_start_time->setTimezone( $tz_start );
    $start_date_time = (array) $LocalTime_start_time;

    return $StartDateTime = $start_date_time['date'];
}

вызов функции

cnvt_UTC_to_usrTime($value_edit['dt_start_time'],Asia/Kolkata);

использование функции date_default_timezone_set перед этим вы хотите, чтобы местное время после этого снова настроить UTC Europe/Lisbon часовой пояс List of Supported Timezones

  <?php

$utc = "2014-05-29T04:54:30.934Z";
$time = strtotime($utc);
echo "<br/>Defualt UTC/server time".$dateInLocal = date("Y-m-d H:i:s", $time);

//your local time zone put here
date_default_timezone_set('Asia/Kolkata');

echo "<br/>Local time". $dateInLocal = date("Y-m-d H:i:s", $time);
?>

попробовать для меня() и даты по часовому поясу

date_default_timezone_set('asia/kolkata');
$utc = "2014-05-29T04:54:30.934Z";
$time = strtotime($utc);
$dateInLocal = date("Y-m-d H:i:s", $time);
echo $dateInLocal;  //2014-05-29 10:24:30
echo '<br>';
date_default_timezone_set('America/Chicago'); 
$time = strtotime($utc .' UTC');
$dateInLocal = date("Y-m-d H:i:s", $time);
echo $dateInLocal; //2014-05-28 23:54:30