不同版本的php返回不同的日期结果

3
我有一个日期 AB
我想获取它们之间的小时数/分钟数,如下所示:
date('h:i', strtotime(B) - strtotime(A));

但是我得到了奇怪的结果:
echo date('h:i', strtotime('2014-01-01') - strtotime('2014-01-01'));
// echoes: 01:00 (!)


date_default_timezone_set('Europe/London');
$date = new DateTime();
$A = $date->format('Y-m-d H:i:s'); echo '<br />';
$date->modify("+64 minutes");
$B = $date->format('Y-m-d H:i:s'); echo '<br />';
echo date('h:i', strtotime($B) - strtotime($A));
// echoes 02:04 (!)

这里是之前代码的实时例子:

为什么会出现这种情况,如何获得预期结果?


@MártonMolnár,在我的第二个例子中,我设置了时区,所以我认为这不是重复。 - Rikard
1
@MártonMolnár 这不是重复的问题。该问题适用于5.0以下版本-> http://3v4l.org/qPZJA - Maciej A. Czyzewski
@MaciejCzyżewski 好的,你是对的,但是时区肯定存在一些问题。 - molnarm
使用 gmdate,示例:http://3v4l.org/QOcpV - Maciej A. Czyzewski
@Rikard $date具有时区信息,但date()函数中没有,因此它使用默认值(+1),我仍然不确定这是否真的是一个重复的问题...请查看PHP手册:date函数“获取本地日期/时间”,而gmdate函数则使用GMT。 - molnarm
显示剩余3条评论
2个回答

1

这是正确的行为

为什么呢?想一想: strtotime('2014-01-01') - strtotime('2014-01-01'),但date()函数期望第二个参数是时间戳。因此,您正在尝试从零时间戳获取日期。而且在不同的时区中,这一点是不同的。您的伦敦时区具有+01偏移量,这就是为什么零点时间戳是1970年1月1日01:00:00 - 这就是为什么date('h:i', 0)01:00的原因。

尝试设置例如莫斯科时区:

date_default_timezone_set('Europe/Moscow');
$date = new DateTime();
$A = $date->format('Y-m-d H:i:s'); 
$date->modify("+64 minutes");
$B = $date->format('Y-m-d H:i:s'); 

echo date('h:i', strtotime($B) - strtotime($A));//04:04

-你将会看到确切的04:04-因为莫斯科的当前偏移量是+03(所以是3小时+64分钟的修改)


好的,我想我明白了。顺便说一下,__这个__ 是不同版本之间的一个bug吗? - Rikard
1
@Rik 这只是意味着各种测试系统配置了不同的默认时区。 - deceze
1
@Rikard 时区处理在5.1.0中有所改变。 - molnarm

1
< p > date 函数期望它的第二个参数是一个 绝对时间戳,然后按照指定格式进行格式化。你输出 h:i 表示你只输出完整的 年、月、日、小时、分钟、秒 时间戳中的 小时:分钟 部分。如果你想要格式化两个时间戳之间的 相对差异,那么使用 date 函数是错误的。由于你实际上正在处理带有 时区绝对 时间戳,因此结果是预期的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接