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