为什么添加日期对象和时间对象返回不正确的值?

时间:2013-07-09 09:51:35

标签: php date

这是我的代码。我添加了一个日期对象和一个时间对象。但答案是返回不正确的价值。我怎么能这样做?

$time_obj           = mktime(23, 20, 10);
$date_obj           = mktime(0, 0, 0, 07, 09, 2013);
$new_date                   = $time_obj+$date_obj;
$date_str           = date('Y-m-d H:i:s', $new_date);
echo($date_str);

$ date_str是一个不正确的值。我怎么能克服这个?

4 个答案:

答案 0 :(得分:3)

添加日期问题的一个很好的解决方案是使用精彩的DateTime类:

$date = new DateTime('2013-07-09');
$time = new DateInterval('P23H20M10S');
$date->add($time);

echo $date->format('Y-m-d H:i:s');

这具有将句点(例如时间,在这种情况下)的概念与绝对日期分开的效果。你所做的实际上是将两个绝对日期加在一起,结果不可避免地令人困惑。

答案 1 :(得分:1)

mktime()函数返回整数,表示自1970年以来的秒数。因此,如果你添加这两个数字,你会得到一些奇怪的东西。由于时间戳存储为整数,因此加法会受到整数溢出的影响,因此对于32位整数,您可能会获得过去的日期。

mktime(23, 20, 10) + mktime(0, 0, 0, 07, 09, 2013)
1373404810 +  1372543200 = 2'745'948'010 seconds since 1970

顺便说一下,发现这个:从PHP 5.1.0开始,这个参数已被弃用。因此,应该使用新的时区处理功能。

答案 2 :(得分:0)

因为mktime总是返回一个时间戳,这是“epoch”(1970-01-01,00:00:00 UTC)的秒数。

mktime(23, 20, 10); 在“23小时20分10秒内”返回秒数。它返回纪元与今天的日期,23:20:10之间的秒数。

您可以按如下方式解决此问题:

...
$time_obj = 23*3600 + 20*60 + 10;
...

答案 3 :(得分:0)

没有办法让时间戳“仅限时间”。它将始终包含日期时间。

时间戳始终是自1970年1月1日以来的秒数。

因此,mktime()将始终返回完整时间戳。

中省略的参数
mktime(23, 20, 10);

将自动替换为当前日期,因此内部将如下所示:

mktime(23, 20, 10, 6, 7, 2013);