以 PHP 格式将 UTC 日期转换为本地时间答答案 2笔记
我使用以下方法将 UTC 日期存储到数据库中:
$utc = gmdate("M d Y h:i:s A");
然后我想将保存的UTC日期转换为客户端的本地时间。
我该怎么做?
谢谢
我使用以下方法将 UTC 日期存储到数据库中:
$utc = gmdate("M d Y h:i:s A");
然后我想将保存的UTC日期转换为客户端的本地时间。
我该怎么做?
谢谢
如果客户端,你的意思是浏览器,那么你首先需要从浏览器将时区名称发送到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');
我建议使用,因为它不会改变变量(不会在幕后更改它们),否则它就像.DateTimeImmutable
DateTime
// 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 发生了两次。无法准确确定这些日期时间。
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);