2

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

$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

4 回答 4

3

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

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

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

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

于 2013-07-09T10:06:02.580 回答
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 开始,此参数已弃用。因此,应该使用新的时区处理功能。

于 2013-07-09T10:05:06.673 回答
0

因为mktime总是返回一个时间戳,它是从“纪元”(即 1970-01-01, 00:00:00 UTC)开始的秒数。

mktime(23, 20, 10);不返回“23 小时 2010 秒”中的秒数。它返回纪元和今天的日期23:20:10 之间的秒数。

您可以通过以下方式克服此问题:

...
$time_obj = 23*3600 + 20*60 + 10;
...
于 2013-07-09T09:54:57.973 回答
0

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

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

因此,mktime()将始终返回完整的时间戳。您在中省略的参数

mktime(23, 20, 10);

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

mktime(23, 20, 10, 6, 7, 2013);
于 2013-07-09T09:55:44.483 回答