首页 > 解决方案 > 理解日期时间差异和反转的问题

问题描述

我在理解日期时间之间的区别时遇到问题。我正在使用 PHP 日期时间类。

这是我计算日期时间差的一小部分代码:

date_default_timezone_set("Asia/Kolkata");

function timeline_date($date)
{
    $today = new DateTime();
    $timeline_date = new DateTime($date);
    $interval = $today->diff($timeline_date);

    echo "<pre>";
    print_r($today);
    print_r($timeline_date);
    print_r($interval);
    echo "</pre>";
}
$date = "2019-02-02 04:36:02";
echo timeline_date($date);

声明的含义是什么:

$interval = $today->diff($timeline_date);

是从 $today 中减去 $timeline_date 吗?

还是从 $timeline_date 中减去 $today?

我对这个特定的陈述感到非常困惑。我在互联网上搜索但没有明确提及。

$timeline_date 也可以是过去或将来的日期,甚至是今天的日期。那么我们应该从大量中减去少量是否重要?

我从上面的代码中得到以下输出:

DateTime Object
(
    [date] => 2019-02-05 16:11:37
    [timezone_type] => 3
    [timezone] => Asia/Kolkata
)
DateTime Object
(
    [date] => 2019-02-02 04:36:02
    [timezone_type] => 3
    [timezone] => Asia/Kolkata
)
DateInterval Object
(
    [y] => 0
    [m] => 0
    [d] => 3
    [h] => 11
    [i] => 35
    [s] => 35
    [weekday] => 0
    [weekday_behavior] => 0
    [first_last_day_of] => 0
    [invert] => 1
    [days] => 3
    [special_type] => 0
    [special_amount] => 0
    [have_weekday_relative] => 0
    [have_special_relative] => 0
)

我们可以[invert] => 1在上面的数组中看到。它的实际意义是什么?如果我将 $date 更改为:

$date = "2019-02-10 04:36:02";

然后[invert] => 0更改为 1。为什么?这是否意味着如果我们有过去的日期差异,那么 invert 将为 0,如果我们有未来的日期,那么这个数组元素将为 1?

标签: phpdatetime

解决方案


DateTime::diff给你两个日期之间的差异,有点明显。哪个更大或更小并不重要,无论如何,增量都是增量。但是,生成的DateInterval对象确实会注意到属性中哪个更大或更小DateInterval::$invert

如果间隔表示负时间段,则为1 ,否则为0。见DateInterval::format()

规则是 if $bin $a->diff($b)is before $a$invertis 1。看着 said DateInterval::format,你会看到:

R    负号“-”,正号“+”负号
r    “-”,正号空

因此,如果您确实关心未来/过去的差异,则可以使用%R/%r格式化参数DateInterval::format来输出“-”和/或“+”。如果您不在乎,只需省略该选项,这无关紧要。


推荐阅读