3
$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 匹配。所以问题在于使用转换将其从 GMT 转换

$timezone=-4

来自用户回答的代码,下面会产生两个小时的时间。从 GMT 转换为 America/New_York 但慢了两个小时。我检查了地名变量以确保它是 America/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'); 

原始问题

而不是将其转换为 America/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');
4

1 回答 1

6
$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 传递到那里或您的任何东西来覆盖它已存储在数据库中。

但是,文档上有一条警告说:注意:

当 $time 参数是 UNIX 时间戳(例如 @946684800)或指定时区(例如 2010-01-28T15:00:00+02:00)时,$timezone 参数和当前时区将被忽略。

文档

于 2012-05-13T07:58:29.040 回答