我遇到了一个我无法理解的愚蠢问题。 接下来的代码怎么样:
public function getFormattedOffsetFrom($refTimezoneId = 'Europe/Paris', $format = 'G\hi') {
$timestamp = time();
$reference = new DateTime('@'.$timestamp);
$referenceTimeZone = new DateTimeZone($refTimezoneId);
$reference->setTimezone($referenceTimeZone);
$datetime = new DateTime('@'.$timestamp);
$datetime->setTimezone($this->timezone);
$offset = $this->timezone->getOffset($datetime) - $referenceTimeZone->getOffset($reference);
$prefix = '+';
if($offset < 0) {
$prefix = '-';
$offset = abs($offset);
}
return $prefix.date($format, $offset);
}
其中$ this-&gt; timezone是位于欧洲/马德里的DateTimeZone实例,当没有指定args时产生+ 1h00 ????
巴黎和马德里没有时间抵消。我只是不明白。
非常感谢你的帮助!!!! Florent的
答案 0 :(得分:2)
为什么要0?西班牙和法国都使用GMT + 1作为时区。
http://en.wikipedia.org/wiki/File:Time_zones_of_Europe.svg
问题在于您尝试使用函数$offset
格式化保持时间差的date()
,其中函数$offset == 0
将时间戳作为第二个参数。如果date
$offsetH = floor( $offset / 3600 ); //full hours
$offsetM = floor(($offset - $offsetH) / 60 ); //full minutes
return sprintf("%s%sh%02s",$prefix,$offsetH,$offsetM) ;
功能将其识别为 1970-01-01 00:00:00 GMT ,那么在您的时区中它将 1970-01-01 01:00:00 GMT + 1 ,您正在使用格式返回小时和分钟,这就是为什么您输入+1的原因。
您必须手动格式化此时差:
{{1}}
答案 1 :(得分:1)
问题可以减少到date('G', 0)
给出“1”。解决方案是使用gmdate()
。