【问题标题】:Count number of months by day in php在php中每天计算月数
【发布时间】:2021-08-10 09:59:52
【问题描述】:

我想得到两个日期之间的月份。我用谷歌搜索了很多,但仍然没有答案。

$date1 = new \DateTime("2021-07-20");
$date2 = new \DateTime("2021-08-15");
$interval = $date2->diff($date1);
dd($interval->m); // 0 months.

上面,计算$date1$date2 小于30 days 所以它返回0 months 这是正确的。但现在我想得到结果 2。现在是 7 月和 8 月。有什么办法可以得到吗?

谢谢

【问题讨论】:

  • 我不明白?不到一个月后,您想如何计算两个日期之间的 2 个月差?
  • 你不想要两个日期之间的实际差异,你想要“覆盖”的月数(或类似的东西。)
  • @MorganFreeFarm 是的..这就是我想问的问题。我想扩展我的知识。 :))
  • 您可以循环增加开始日期的月份,直到“进入”结束日期的月份 - 并计算您必须这样做的次数(加一。)

标签: php date


【解决方案1】:

我尝试了一些方法来解决这个问题。

我发现适用于所有用例的最简单方法是使用常规数学而不是日期函数。由于一个月的天数不同,我尝试过的日期差异方法在某些时候都给出了错误的答案。

function getCoveredMonths(DateTime $date1, DateTime $date2): int {
    $earlierDate = min($date1, $date2);
    $laterDate = max($date1, $date2);

    $earlierMonthValue = $earlierDate->format("Y") * 12 + $earlierDate->format("n");
    $laterMonthValue = $laterDate->format("Y") * 12 + $laterDate->format("n");
    
    return $laterMonthValue - $earlierMonthValue + 1;
}

// Your example
$date1 = new DateTime("2021-07-20");
$date2 = new DateTime("2021-08-15");
var_dump(getCoveredMonths($date1, $date2));
// 2: July + August

// Same month
$date3 = new DateTime("2021-07-15");
$date4 = new DateTime("2021-07-20");
var_dump(getCoveredMonths($date3, $date4));
// 1: July

// Day overflow test (01-30 + 1 month = 02-30 which overflows to 03-02)
$date5 = new DateTime("2021-01-30");
$date6 = new DateTime("2021-03-01");
var_dump(getCoveredMonths($date5, $date6));
// 3: January + February + March

// Year pass test
$date7 = new DateTime("2021-12-20");
$date8 = new DateTime("2022-02-15");
var_dump(getCoveredMonths($date7, $date8));
// 3: December + January + February

// Wrong order ($date2 is before $date1)
$date9 = new DateTime("2021-10-20");
$date10 = new DateTime("2021-08-15");
var_dump(getCoveredMonths($date9, $date10));
// 3: August + September + October

【讨论】:

  • 太好了。我整天都在寻找。非常感谢+1
【解决方案2】:
<?php
$origin = new \DateTime('2020-08-01');
$target = new \DateTime('2021-12-01');
$interval = $origin->diff($target);
echo (($interval->format('%y') * 12) + $interval->format('%m'));

// output is 16 months

?>

【讨论】:

  • 这没有给出示例中日期的预期结果。
【解决方案3】:

如果你想用整月计算,你必须从开始月份的第一天到月底之后的第一天计算。

$date1 = new \DateTime("2021-07-20");
$date2 = new \DateTime("2021-08-15");

//
$date1->modify('first day of this Month');  //2021-07-01
$date2->modify('first day of next Month');  //2021-09-01

$interval = $date1->diff($date2);
$countMonth = $interval->m;  //2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    相关资源
    最近更新 更多