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

时间:2012-05-13 07:51:33

标签: php datetime date timezone

$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,但它慢了两个小时。我检查了placename变量以确保它是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

存储在db中
$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');

1 个答案:

答案 0 :(得分: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来覆盖它或者无论你存储在数据库中的什么。

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

  

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

Docs