如何确定本周是否是该月的第一周? (最好用碳)
How can I determine if this week is the first week of the month? (Preferably with Carbon)
我们需要确定“每月的第一周”。据我所知,没有 ISO 标准,但我遇到了两个定义:
- 一个月的第一周是包含该月第一天的那一周。
- 该月的第一周是该月的第一个完整周。
在我们的应用程序中,我们经常使用 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);
}
我再次测试了它,它按预期工作。
我们需要确定“每月的第一周”。据我所知,没有 ISO 标准,但我遇到了两个定义:
- 一个月的第一周是包含该月第一天的那一周。
- 该月的第一周是该月的第一个完整周。
在我们的应用程序中,我们经常使用 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);
}
我再次测试了它,它按预期工作。