Nesbot Carbon diffInHours 的奇怪结果

Kur*_*ars 3 php laravel php-carbon tinker

我正在做一些tinker关于 SO 的另一个问题。并且对于 Carbon 的 diffInHours 有一些奇怪的行为。未来时间的差异与过去时间的差异不同。这是我的修补程序命令和返回值:

>>> \Carbon\Carbon::now()->diffInHours(\Carbon\Carbon::now()->addHours(3))
=> 3
>>> \Carbon\Carbon::now()->addHours(3)->diffInHours(\Carbon\Carbon::now())
=> 2
>>> \Carbon\Carbon::now()->addHours(3)->diffInHours(\Carbon\Carbon::now())
=> 2
>>> \Carbon\Carbon::now()->addHours(3)->diffInHours(\Carbon\Carbon::now())
=> 2
>>> \Carbon\Carbon::now()
=> Carbon\Carbon @1595427497 {#4431
     date: 2020-07-22 14:18:17.952594 UTC (+00:00),
   }
Run Code Online (Sandbox Code Playgroud)

有没有人对导致这种行为的原因有任何见解?

OMR*_*OMR 6

\Carbon\Carbon::now()->addHours(3)->diffInHours(\Carbon\Carbon::now();
Run Code Online (Sandbox Code Playgroud)

让我们分解它来弄清楚发生了什么:

1- 你得到代表现在的日期时间。

2-你增加了3个小时。结果将是现在 + 3 小时。

3- 你得到 diffInHours 与 'now'(女巫与第一个 'now' 相差几秒)女巫将是 2.9999999180556

4- diffInHours 将结果向下舍入(如在 doc 中),结果将为 2 ..

如果你想在不舍入的情况下获得真正的差异,你可以使用 floatDiffInRealHours,这会给你 2.9999999180556

问题是两个 \Carbon\Carbon::now() 被调用之间的延迟。如果您使用复制的 Carbon 实例,您可以看到没有问题:

>>> $now = \Carbon\Carbon::now()
=> Carbon\Carbon @1595429110 {#4367
     date: 2020-07-22 14:45:10.767156 UTC (+00:00),
   }
>>> $threeHoursFromNow = $now->copy()->addHours(3)
=> Carbon\Carbon @1595439910 {#4428
     date: 2020-07-22 17:45:10.767156 UTC (+00:00),
   }
>>> $now->diffInHours($threeHoursFromNow)
=> 3
>>> $threeHoursFromNow->diffInHours($now)
=> 3
Run Code Online (Sandbox Code Playgroud)

  • 这就说得通了。我刚刚有了同样的认识,并将为您的答案添加一些进一步的证据。我想我精神错乱了:) (2认同)