在PHP中将UTC日期转换为本地时间

时间:2010-09-25 01:29:46

标签: php datetime timezone

我使用以下方法将UTC日期存储到数据库中:

$utc = gmdate("M d Y h:i:s A");

然后我想将保存的UTC日期转换为客户端的本地时间。

我该怎么做?

由于

10 个答案:

答案 0 :(得分:59)

PHP的strtotime函数将解释时区代码,如UTC。如果你从没有时区代码的数据库/客户端获得日期,但知道它是UTC,那么你可以追加它。

假设您获得带有时间戳代码的日期(例如“Fri Mar 23 2012 22:23:03 GMT-0700(PDT)”,这是Javascript代码""+(new Date())给出的):

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

如果你不这样做,那么可能来自MySQL,那么:

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

答案 1 :(得分:47)

答案

将UTC日期时间转换为America / Denver

// create a $dt object with the UTC timezone
$dt = new DateTime('2016-12-12 12:12:12', new DateTimeZone('UTC'));

// change the timezone of the object without changing it's time
$dt->setTimezone(new DateTimeZone('America/Denver'));

// format the datetime
$dt->format('Y-m-d H:i:s T');

注释

time()会返回unix timestamp,这是一个数字,没有时区。

date('Y-m-d H:i:s T')返回当前区域设置时区的日期。

gmdate('Y-m-d H:i:s T')以UTC格式返回日期

date_default_timezone_set()更改当前的区域设置时区

更改时区的时间

// create a $dt object with the America/Denver timezone
$dt = new DateTime('2016-12-12 12:12:12', new DateTimeZone('America/Denver'));

// change the timezone of the object without changing it's time
$dt->setTimezone(new DateTimeZone('UTC'));

// format the datetime
$dt->format('Y-m-d H:i:s T');

在这里你可以看到所有可用的时区

https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

这里是所有格式选项

http://php.net/manual/en/function.date.php

更新PHP时区数据库(在linux中)

sudo pecl install timezonedb

答案 2 :(得分:10)

date()localtime()都使用服务器的本地时区,除非被覆盖;您可以覆盖与date_default_timezone_set()一起使用的时区。

http://www.php.net/manual/en/function.date-default-timezone-set.php

http://us3.php.net/manual/en/function.date.php

http://php.net/manual/en/function.localtime.php

答案 3 :(得分:8)

如果您只想在不同的时区显示相同的时间戳,则不需要日期算术:

$format = "M d, Y h:ia";
$timestamp = gmdate($format);

date_default_timezone_set("UTC");
$utc_datetime = date($format, $timestamp);

date_default_timezone_set("America/Guayaquil");
$local_datetime = date($format, $timestamp);

答案 4 :(得分:6)

首先,以UTC格式获取日期 - 您已经这样做了,所以这一步真的只是一个数据库调用:

$timezone = "UTC";
date_default_timezone_set($timezone);

$utc = gmdate("M d Y h:i:s A");
print "UTC: " . date('r', strtotime($utc)) . "\n";

接下来,在PHP中设置您的本地时区:

$timezone = "America/Guayaquil";
date_default_timezone_set($timezone);

现在以秒为单位获得偏移:

$offset = date('Z', strtotime($utc));
print "offset: $offset \n";

最后,将偏移量添加到原始日期时间的整数时间戳:

print "LOCAL: " . date('r', strtotime($utc) + $offset) . "\n";

答案 5 :(得分:5)

我在这里共享脚本,将UTC时间戳转换为印度时间戳:-

    // create a $utc object with the UTC timezone
    $IST = new DateTime('2016-12-12 12:12:12', new DateTimeZone('UTC'));

    // change the timezone of the object without changing it's time
    $IST->setTimezone(new DateTimeZone('Asia/Kolkata'));

    // format the datetime
   echo $IST->format('Y-m-d H:i:s T');

答案 6 :(得分:4)

我以UTC格式将日期存储在数据库中,然后我将其显示给当地时区的最终用户

// retrieve
$d = (new \DateTime($val . ' UTC'))->format('U');
return date("Y-m-d H:i:s", $d);

答案 7 :(得分:4)

以下是将提问者的UTC时间转换为本地时间的直接方法。这是在数据库等中存储的时间,即任何时间。您只需要找到UTC时间和您感兴趣的当地时间之间的时差,然后调整存储的UTC时间就可以增加差异。

$df = "G:i:s";  // Use a simple time format to find the difference
$ts1 = strtotime(date($df));   // Timestamp of current local time
$ts2 = strtotime(gmdate($df)); // Timestamp of current UTC time
$ts3 = $ts1-$ts2;              // Their difference

然后,您可以将此差异添加到存储的UTC时间。 (在我的位置,雅典,差异恰好是5:00:00)

示例:

$time = time() // Or any other timestamp
$time += $ts3  // Add the difference
$dateInLocal = date("Y-m-d H:i:s", $time);

答案 8 :(得分:1)

给定本地时区,例如“America / Denver”,您可以使用DateTime类将UTC时间戳转换为本地日期:

$timestamp = *********;
$date = new DateTime("@" . $timestamp);
$date->setTimezone(new DateTimeZone('America/Denver'));
echo $date->format('Y-m-d H:i:s');

答案 9 :(得分:0)

$UTC_Time   = "2018-07-06 06:06:16";
echo "UTC Time ".$UTC_Time;
$Indian_Time = TimeConverion($UTC_Time);
echo "<br> Indian_Time ".$Indian_Time;

function TimeConverion($UTC_Time) {
  date_default_timezone_set('Europe/London');
  $sTime = date("Y-m-d h:i:sa");
  $ts3 = strtotime(date("G:i:s"))-strtotime($sTime); 
  $utc = explode(" ",$UTC_Time);
  $time = strtotime($utc[1]);
  date_default_timezone_set("Asia/Calcutta");
  $time += $ts3;  // Add the difference
  return $utc[0]." ".date("H:i:s", $time);
}