PHP将UTC时间转换为本地时间

时间:2014-05-29 05:25:56

标签: php datetime timezone

从我的服务器获取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;

9 个答案:

答案 0 :(得分:13)

只需使用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

答案 1 :(得分:12)

您的代码无法正常工作的原因很可能是因为您的服务器处于UTC时间。所以服务器的本地时间是 UTC。

解决方案#1

一个可能的解决方案是执行以下服务器端并将epoch整数传递给浏览器:

$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小时)。您可以通过查看此处来使用此信息来设置时区:Convert UTC offset to timezone or date

答案 2 :(得分:3)

如果这不是通过用户配置文件设置完成的,则使用javascript时间库可能更简单,更简单。 moment.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);
}

答案 3 :(得分:2)

只需将UTC时间发送到浏览器即可。使用JavaScript使用Date对象或moment.js解析它,然后将其作为文本输出。

通过在客户端JavaScript中执行此操作,您无需了解用户的时区。浏览器将对此负责。

答案 4 :(得分:2)

#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&#39);

#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);

答案 5 :(得分:1)

在您希望再次设置UTC Europe/Lisbon时区后的本地时间之前使用函数date_default_timezone_set 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);
?>

答案 6 :(得分:0)

尝试使用date_default_timezone_set()并根据时区设置日期

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 

答案 7 :(得分:0)

$savedtime = '2019-05-25 00:01:13'; //this is America/Chicago time
$servertime = ini_get('date.timezone');
$time = strtotime($savedtime . $servertime);
$dateInLocal = date("Y-m-d H:i:s", $time);
echo $dateInLocal;

display value according to local timezone
2019-05-25 10:31:13  // this is Asia/Kolkata time

答案 8 :(得分:-1)

protected function get_timemillizone_date($timezone_id)
{
    date_default_timezone_set($timezone_id);
    $availdate = date('Y-m-d');
    $stamp = strtotime($availdate); // get current date timestamp
    $currenttimemill = $stamp * 1000;
    return $currenttimemill;
}

$timezone_id = "Asia/Kolkata";
$DATA = $this->get_timemillizone_date($timezone_id);
echo $DATA;