日期在不同版本的PHP中返回不同的结果

时间:2014-01-12 11:25:56

标签: php

我有一个日期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 (!)

Live example代码:

为什么会这样以及如何获得预期结果?

2 个答案:

答案 0 :(得分:1)

正确行为

为什么呢?考虑一下:strtotime('2014-01-01') - strtotime('2014-01-01') - 但date()期望 timestamp 作为第二个参数。这意味着,您正试图从零点时间戳获取日期。在不同的时区,这一点是不同的。您的London TZ的偏移量为+01,这就是0点时间戳为01 Jan 1970 01:00:00的原因 - 这就是为什么date('h:i', 0)01:00

尝试设置,例如Moscow zone:

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(所以03小时+ 64分钟修改)

答案 1 :(得分:1)

date期望的第二个参数是绝对时间戳,然后以指定的格式进行格式化。输出h:i表示您只输出完整年,月,日,小时,分钟,秒时间戳的小时:分钟部分。如果要格式化两个时间戳之间的相对差异date是错误的函数。结果是预期的,因为您实际上正在处理时区中的绝对时间戳。