以 PHP 格式将 UTC 日期转换为本地时间答答案 2笔记

2022-08-30 11:04:38

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

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

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

我该怎么做?

谢谢


答案 1

如果客户端,你的意思是浏览器,那么你首先需要从浏览器将时区名称发送到PHP,然后按如下所述进行转换。

将 UTC 日期时间转换为美国/丹佛

// 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 its time
$dt->setTimezone(new DateTimeZone('America/Denver'));

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

这适用于 2032 年之后的日期、夏令时和闰秒,并且不依赖于主机区域设置或时区。

它使用时区db进行计算,此db会随着时区规则的变化而随时间而变化,并且必须保持最新。(请参阅底部的注释)

若要将 UTC 日期转换为服务器(本地)时间,可以使用不带第二个参数(默认为服务器时区)的参数。DateTime

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

// get the local timezone
$loc = (new DateTime)->getTimezone();

// change the timezone of the object without changing its time
$dt->setTimezone($loc);

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

答案 2

我建议使用,因为它不会改变变量(不会在幕后更改它们),否则它就像.DateTimeImmutableDateTime

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

// Create a new instance with the new timezone
$dt_denver = $dt_utc->setTimezone(new DateTimeZone('America/Denver'));

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

不可变性允许您多次使用链接,而无需更改$dt

$dt = new DateTimeImmutable('2016-12-12 12:12:12', new DateTimeZone('UTC'));

// Format $dt in Denver timezone
echo $dt->setTimezone(new DateTimeZone('America/Denver'))->format('Y-m-d H:i:s T');

// Format $dt in Madrid timezone
echo $dt->setTimezone(new DateTimeZone('Europe/Madrid'))->format('Y-m-d H:i:s T');

// Format $dt in Local server timezone
echo $dt->setTimezone((new DateTime())->getTimezone())->format('Y-m-d H:i:s T');

笔记

time()返回 unix 时间戳,这是一个数字,它没有时区。

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 时区 DB(在 Linux 中)

sudo pecl install timezonedb

由于夏令时,某些日期在某些时区重复,例如,在美国,2011 年 3 月 13 日凌晨 2:15 从未发生过,而 2011 年 11 月 6 日凌晨 1:15 发生了两次。无法准确确定这些日期时间。


答案 2

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

假设您获得带有时间戳代码的日期(例如“星期五 23 Mar 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);

推荐