【问题标题】:How can I determine if this week is the first week of the month? (Preferably with Carbon)如何确定这周是否是本月的第一周? (最好用碳)
【发布时间】:2022-02-01 23:46:12
【问题描述】:

我们需要确定“每月的第一周”。据我所知,没有这方面的 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);
}

【问题讨论】:

标签: html laravel datetime php-carbon iso


【解决方案1】:

根据您对一周第一天的看法,您可以这样做:

我认为您将星期一视为一周的第一天。

// 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,您可以确定某个日期是否介于该月第一周的星期一和星期日之间。

【讨论】:

  • 这确实是一个很好的解决方案,我不知道 Carbon firstOfMonth() 函数,你可以传递一个天数给它。酷。
【解决方案2】:

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

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

我再次对其进行了测试,它按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多