PHP date_create函数,使用时区缩写将 UTC 时间转换为不同的时区


$placename=timezone_name_from_abbr("", $timezone * 3600, false);
                        $date = date_create($list['stamp'], timezone_open($placename));
                        $datetimezone=new DateTimeZone('Europe/London');
                        $dateTime = new DateTime($list['stamp'],$datetimezone); 
                        $dateTime->setTimeZone(new DateTimeZone($placename)); 

编辑

我尝试了以下建议的代码作为答案,它产生的时间比应有的时间少了 2 个小时。我检查了我的数据库,数据库中的时间与格林威治标准时间匹配。所以问题在于使用转换将其从 GMT 转换

$timezone=-4

来自用户答案的代码,下面产生两个小时的时间。 从格林尼治标准时间转换为美国/New_York但慢了两个小时。我检查了地名变量,以确保它是美国/New_York。可能是什么原因造成的?

$placename=timezone_name_from_abbr("", $timezone * 3600, true);
$dateTime = new DateTime($list['stamp']); 
$dateTime->setTimeZone(new DateTimeZone($placename)); 
echo $dateTime->format('F d g:i a'); 

原始问题

而不是将其转换为美国/New_York时间,这产生了我存储在数据库中的UTC时间,为什么会这样,为什么不转换时间? 它存储在数据库中作为2012-05-13 07:30:47

$placename=timezone_name_from_abbr("", $timezone * 3600, true);
$date = date_create($list['stamp'], timezone_open($placename));
echo date_format($date, 'F d g:i a');
$dateTime = new DateTime($date,new DateTimeZone('Europe/London')); 
$dateTime->setTimeZone(new DateTimeZone('America/New_York')); 
echo $dateTime->format('F d g:i a'); 

请注意,我在创建 DateTime 对象时添加了第二个参数,以确保它知道我传递的是 GMT 时间,其他方式它将假定您的服务器本地时间,并且最终可能会得到不同的结果。

到您的第一个版本,不带引号。

顺便说一下,您正在(在您的代码上(分配一个不带引号的字符串,这可能会导致也可能不会导致错误,因为 PHP 会尝试查找一个名为 America 的常量并将其除以常量名称New_York但我假设这不是你所追求的。

如果你有所有的警告/通知/错误显示,你会看到以下几行:

Notice: Use of undefined constant America - assumed 'America' in line 3;

如果你想考虑一下,它最终会返回一个实际的警告(之前的两个是通知(,告诉你你的潜水是零。PHP是危险的,因为它可以让你做各种疯狂的事情,而不会真正破坏任何东西。不要误会我的意思,我喜欢PHP,你只需要一开始要小心。

我给你的代码:)

如果您在创建时未指定时区(作为构造函数的第二个参数(,它将假定时区是您当前的时区(服务器时区(,您可以通过传递 GMT 时区或您存储在数据库中的任何内容来覆盖它。

但是,文档中有一个警告说:注意:

$timezone当 $time参数要么是 UNIX 时间戳(例如 @946684800(,要么是 指定时区(例如 2010-01-28T15:00:00+02:00(。

文档

相关内容

  • 没有找到相关文章