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

13

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

你的两种情况对我来说都很好用。http://codepad.viper-7.com/jaaVry - Deepu
10个回答

22

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


感谢您的快速回复。我如何知道用户所在的“Asia/Kolkata”时区?用户可能来自世界上任何地方。这是一个静态值吗? - Dibish
@Dibish 我假设您知道所需的时区。请参考Martin的答案,了解从客户端获取信息的相关内容。 - Phil

16

你的代码不能正常工作的原因很可能是因为你的服务器在使用UTC时间。所以,服务器的本地时间就是UTC时间。

解决方法 #1

一个潜在的解决方案是在服务器端执行以下操作,并将epoch整数传递到浏览器:

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

然后使用JavaScript将时期整数转换为用户的本地时间(浏览器知道用户的时区)。

解决方案#2

您可以让浏览器向您发送用户的时区。 然后,您可以使用此信息在服务器端而不是浏览器端计算日期字符串。 在此处查看更多信息:https://dev59.com/S2445IYBdhLWcg3wq8Lp#5607444

这将为您提供用户的偏移量(-7小时)。 您可以使用此信息通过查看此处来设置时区:将UTC偏移量转换为时区或日期


非常感谢您的帮助。 - Dibish
1
方案#2是不明智的,因为你只能直接从JavaScript获取当前时区偏移量。你可以使用jsTimeZoneDetect猜测时区,但这只能帮助你到一定程度。方案#1更好,但它有自己的问题集 - Matt Johnson-Pint
@MattJohnson 我猜你可以从 new Date() 中提取时区,它返回 Tue Oct 25 2016 12:43:28 GMT-0400 (EDT),但如果我没记错的话,EDT/EST并不是非常独特的(世界上有各种可能与3个字符时区表示重叠的时区)。也许偏移量和3个字符表示的混合可能会起作用。 - Martin Konecny
不幸的是,括号中的值是实现特定的,并且在各个平台上差异很大。它并不总是缩写,而且是模棱两可的(例如,有5种不同的CST)。 - Matt Johnson-Pint
你需要使用 ; - thedanotto
另一个缺陷(针对某些进程或服务器相关需求)是它会丢失毫秒。对于那些需要这种精度的人来说,可以通过将源的毫秒数添加到结果中并创建数字而不是整数来解决这个问题。 - Robert Mauro

4
如果不能通过用户个人资料设置完成,使用JavaScript时间库比较容易和简单,例如moment.js (http://momentjs.com/)来解决这个问题(将所有日期/时间发送到UTC,然后在客户端进行转换)。

JavaScript示例如下(我相信这可以在不创建两个moment对象的情况下实现(可以随意修复)。

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

2

在你想要使用本地时间的地方之前,使用函数date_default_timezone_set,然后再次设置UTC Europe/Lisbon时区。 支持的时区列表

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

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

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

2

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

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


1

尝试使用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 

1

$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


0
$utc_date = '2021-10-07T11:01:07';
//local timezone or ant timezone you want
$timezone = 'America/Los_Angeles';
$timestamp = strtotime($utc_date);
$date = new DateTime();
$date->setTimestamp($timestamp);

$date->setTimezone(new \DateTimeZone($timezone));
echo $date->format('m-d-Y g:i A') . "\n";

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

欢迎来到 Stack Overflow!仅包含代码的答案并不是特别有帮助。请添加一些描述,说明这段代码如何解决问题。 - Sven Eberth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接