如何确定本周是否是该月的第一周? (最好用碳)

How can I determine if this week is the first week of the month? (Preferably with Carbon)

我们需要确定“每月的第一周”。据我所知,没有 ISO 标准,但我遇到了两个定义:

  1. 一个月的第一周是包含该月第一天的那一周。
  2. 该月的第一周是该月的第一个完整周。

在我们的应用程序中,我们经常使用 ISO 周格式,例如“2022-W09”,这意味着(显然)2022 年第 9 周。

因此,我们可以轻松找到一年中的第一周“2022-W01”及其包含的日期:从 2022-01-03 到 2022-01-09(根据 HTML5 输入类型周).

这告诉我(尽管我首先喜欢并实施了第一个定义)我们应该接受第二个定义,因为 HTML 紧随其后。

作为结论,我需要一个算法来找到“一个月的第一周”,我接受它是“那个月的第一个完整周”(第二个定义)。

特此,我将用于查找“包含该月第一天的那一周”的代码放在上面的第一个定义中,即“该月的第一周”。您可以修改它以提出解决方案:

public function isFirstWeekOfMonth()
{
    $carbon = Carbon::create()->setISODate(2022, 9);
    $startOfWeekCarbon = $carbon->startOfWeek();
    $endOfWeekCarbon = $carbon->endOfWeek();
    $startOfMonthCarbon = $carbon->endOfWeek()->startOfMonth();

    return $startOfMonthCarbon->betweenIncluded($startOfWeekCarbon, $endOfWeekCarbon);
}

根据您认为一周的第一天是什么,您可以这样做:

我会考虑您将 星期一 视为一周的第一天。

// Create a date (carbon)
$carbon = Carbon::create()->setISODate(2022, 9); 

// Find the first Monday in the month for given date. For Tuesday use 2, Wednesday 3 ... 
$firstMondayInTheMonth = $carbon->firstOfMonth(1); // This is also a start of that week

// Find the end of the week.
$endOfTheWeek = $firstMondayInTheMonth->endOfWeek();

在下图中您可以看到它在实践中是如何工作的:

有了这个,你就有了这个月的第一个星期一——这意味着一周的第一个开始,使用 endOfWeek 你可以得到那个星期的星期日(第一周的结束)。使用 betweenIncluded 您可以确定某个日期是否介于该月第一周的星期一和星期日之间。

我已经根据接受的答案更新了我的功能:

public function isFirstWeekOfMonth()
{
    $carbon = Carbon::create()->setISODate(2022, 10);
    $startOfWeekDate = $carbon->startOfWeek()->format('Y-m-d');
    $endOfWeekDate = $carbon->endOfWeek()->format('Y-m-d');

    $firstMondayInMonth = $carbon->firstOfMonth(1);

    return $firstMondayInMonth->betweenIncluded($startOfWeekDate, $endOfWeekDate);
}

而且我已经测试过了,它按预期工作。

本周 (2022-W09),错误:

下周 (2022-W10) 为真:

注意:我意识到我错误地使用了 betweenIncluded() 函数,它接受日期作为参数,而不是 Carbon 对象。

=== 决赛 ===

我觉得我已经把这个功能做到最好了,算法最简单:

"如果该月的第一个星期一等于本周的第一个日期,则为该月的第一周。"

public function isFirstWeekOfMonth()
{
    $currentWeekCarbon = Week::carbon($this->week);
    $startOfWeekCarbon = $currentWeekCarbon->startOfWeek();
    $firstMondayInMonthCarbon = $currentWeekCarbon->firstOfMonth(1);

    return $startOfWeekCarbon->equalTo($firstMondayInMonthCarbon);
}

我再次测试了它,它按预期工作。