我有一个日期A
和B
。
我想得到他们之间的小时/分钟。像:
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代码:
为什么会这样以及如何获得预期结果?
答案 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
是错误的函数。结果是预期的,因为您实际上正在处理时区中的绝对时间戳。