PHP: 3月份两个日期的差异不正确


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);

下面是六月份的一些输出(正确的计算夜晚数):

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月份的总金额比应该的少,我将不胜感激。:)

值得注意的是,所有不正确的结果包括2015-03-08,其中对于某些时区,DST在02:00:00生效,因此损失了一个小时,这与您的结果一致。您可以尝试包括:

date_default_timezone_set('UTC');

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

日期不是简单的数学运算就能搞定的。一天并不总是86400秒,有些日子也没有24小时。

https://3v4l.org/LrTKb是您3月份第一期的一个例子,正确使用了DateTime对象。