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 对象正确完成。
我在计算 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 对象正确完成。