Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中转换时区_Php_Time_Timezone - Fatal编程技术网

在PHP中转换时区

在PHP中转换时区,php,time,timezone,Php,Time,Timezone,我有一个脚本,它引入了来自不同时区的RSS提要。然后我发布了一个twitter风格的时间显示,上面写着“大约10分钟前发布”的RSS提要。但是因为我不能把这些时间转换成我的GMT时区,所以这个显示屏显示的时间是错误的,比如美国东部标准时间的帖子在新的时候总是说“大约5小时前” 我四处寻找解决办法,但似乎没有一个对我有效。我想知道你能否告诉我哪里出了问题 $dbTimezone = new DateTimeZone($dbStoredTimezone); //$dbStoredTimezone =

我有一个脚本,它引入了来自不同时区的RSS提要。然后我发布了一个twitter风格的时间显示,上面写着“大约10分钟前发布”的RSS提要。但是因为我不能把这些时间转换成我的GMT时区,所以这个显示屏显示的时间是错误的,比如美国东部标准时间的帖子在新的时候总是说“大约5小时前”

我四处寻找解决办法,但似乎没有一个对我有效。我想知道你能否告诉我哪里出了问题

$dbTimezone = new DateTimeZone($dbStoredTimezone); //$dbStoredTimezone = 'EST'
$dbDate = new DateTime($dbStoredDate, $dbTimezone); //$dbStoredDate = '2012-03-01 05:27:26'
$gmtTimezone = new DateTimeZone('GMT');
echo $gmtTimezone->getOffset($dbDate); //always echo's 0
$offset = DateInterval::createFromDateString ($gmtTimezone->getOffset($dbDate));
$dbDate->add($offset);

问题似乎出在您的
$gmtTimezone=newdatetimezone('GMT')。因为
getOffset()
返回GMT的偏移量(请参见此处:)。这就是为什么它总是返回
0

如果使用
DateTime::getOffset()
方法,它应该可以工作

以下是您编辑的代码:

<?php
$dbTimezone = new DateTimeZone($dbStoredTimezone); //$dbStoredTimezone = 'EST'
$dbDate = new DateTime($dbStoredDate, $dbTimezone);
echo $dbDate->getOffset();
$offset = DateInterval::createFromDateString ($dbDate->getOffset());
$dbDate->add($offset);

问题似乎出在您的
$gmtTimezone=newdatetimezone('GMT')。因为
getOffset()
返回GMT的偏移量(请参见此处:)。这就是为什么它总是返回
0

如果使用
DateTime::getOffset()
方法,它应该可以工作

以下是您编辑的代码:

<?php
$dbTimezone = new DateTimeZone($dbStoredTimezone); //$dbStoredTimezone = 'EST'
$dbDate = new DateTime($dbStoredDate, $dbTimezone);
echo $dbDate->getOffset();
$offset = DateInterval::createFromDateString ($dbDate->getOffset());
$dbDate->add($offset);

阅读这里的红色框:嗯,这可能是个问题,因为RSS提要pubDate使用的是EST的时区格式,当我硬编码EST为美国/纽约,GMT为欧洲/伦敦时仍然没有变化,不像这样定义(“TZ_时区”,“美国/纽约”);日期默认时区设置(TZ时区);RSS时间域是否包含时区信息?请阅读此处的红色框:嗯,这可能是个问题,因为RSS提要pubDate使用EST的时区格式。当我硬编码EST为America/New_York,GMT为Europe/London时,仍然没有任何更改。不喜欢这样的设置定义(“TZ_时区”,“America/New_York”);日期默认时区设置(TZ时区);RSS时间域是否包含时区信息?非常感谢,伙计,就是这样。我还必须将获取DateInterval对象的方式更改为
$offset=newDateInterval('PT'.str_replace('-','',$dbDate->getOffset()).S')。但我认为这个解决方案有点粗制滥造,太感谢了,老兄,就是这样。我还必须将获取DateInterval对象的方式更改为
$offset=newDateInterval('PT'.str_replace('-','',$dbDate->getOffset()).S')。但我认为这个解决方案有点老套