PHP:三月两个日期之间的差异不正确

PHP: Difference Between Two Dates Incorrect For March

我在计算 PHP 中两个日期之间的天数时遇到了一些问题。

我发现的问题只存在于 3 月的一些 个日期(但不是全部,它似乎不影响其他月份)。

我使用的代码:

// The Calculation.
// Note: $endDate, and $startDate are unix timestamps returned from strtotime().

$diff = $endDate - $startDate;
$totalNights = floor($diff/(60*60*24));

// Debugging.                
$debugStr = "FROM " . 
    date("Y-m-d", $startDate) . 
    " - ". date("Y-m-d", $endDate) . 
    ": $totalNights Nights"; 

file_put_contents("/tmp/date_debug.txt", $debugStr . PHP_EOL, FILE_APPEND);

这是 6 月的一些输出(计算出正确的住宿天数):

FROM 2015-06-01 - 2015-06-03: 2 Nights     // Correct
FROM 2015-06-16 - 2015-06-26: 10 Nights    // Correct
FROM 2015-06-19 - 2015-06-22: 3 Nights     // Correct
FROM 2015-06-01 - 2015-06-02: 1 Nights     // Correct
FROM 2015-06-21 - 2015-06-23: 2 Nights     // Correct
FROM 2015-06-21 - 2015-06-23: 2 Nights     // Correct
FROM 2015-06-01 - 2015-06-01: 0 Nights     // Correct
FROM 2015-06-03 - 2015-06-04: 1 Nights     // Correct
FROM 2015-06-05 - 2015-06-06: 1 Nights     // Correct
FROM 2015-06-12 - 2015-06-16: 4 Nights     // Correct
FROM 2015-06-01 - 2015-06-03: 2 Nights     // Correct
FROM 2015-06-04 - 2015-06-30: 26 Nights    // Correct

这是 3 月份的一些输出(一些正确,一些不正确)

FROM 2015-03-05 - 2015-03-31: 25 Nights    // INCORRECT: Should Be 26 Nights 
FROM 2015-03-16 - 2015-03-19: 3 Nights     // Correct
FROM 2015-03-05 - 2015-03-10: 4 Nights     // INCORRECT: Should Be 5 Nights
FROM 2015-03-23 - 2015-03-27: 4 Nights     // Correct
FROM 2015-03-08 - 2015-03-11: 2 Nights     // INCORRECT: Should Be 3 Nights
FROM 2015-03-08 - 2015-03-19: 10 Nights    // INCORRECT: Should Be 11 Nights 
FROM 2015-03-21 - 2015-03-26: 5 Nights     // Correct
FROM 2015-03-01 - 2015-03-26: 24 Nights    // INCORRECT: Should Be 25 Nights.
FROM 2015-03-20 - 2015-03-27: 7 Nights     // Correct.

如果您能就 3 月份的某些总数比应有的总数少 1 的原因提出任何建议,我们将不胜感激。 :)

值得注意的是,您所有的错误结果都包括 2015-03-08,其中对于某些时区,DST 在 02:00:00 生效,这样一小时就丢失了,这与您的结果一致.您可以尝试包括:

date_default_timezone_set('UTC');

在任何日期和时间计算之前,看看结果是否正确。

日期不是你可以做简单数学运算的东西。一天并不总是 86400 秒,有些日子没有 24 小时。

https://3v4l.org/LrTKb 是您 3 月第一期的示例,使用 DateTime 对象正确完成。