Carbon:在了解年份和年份的星期时获取星期的开始和结束日期

Carbon: Get start and end date of week when knowing week in year and year

Carbon 提供函数 weekOfYear 以整数形式获取一年中的第几周。但是,我需要反其道而行之,以根据年份 + 一年中的星期获得日期。

Carbon::now()->weekOfYear(); // todays week of the year

例如

因此我需要这周的开始和结束日期。但是我在 Carbon 文档中找不到合适的函数

Carbon 是 PHP 的 DateTime 的包装器,因此您可以使用 setISODate:

$date = Carbon::now(); // or $date = new Carbon();
$date->setISODate(2016,42); // 2016-10-17 23:59:59.000000
echo $date->startOfWeek(); // 2016-10-17 00:00:00.000000
echo $date->endOfWeek(); // 2016-10-23 23:59:59.000000
/**
 * @return array{0: \DateTime, 1: \DateTime}
 */
public static function getWeekDates(\DateTimeInterface $selectedDate): array
{
    $daysFromMonday = (int) $selectedDate->format('N') - 1;

    $fromDate = \DateTimeImmutable::createFromInterface($selectedDate)->modify("-{$daysFromMonday} days");

    $toDate = $fromDate->modify('+6 days');

    return [
        \DateTime::createFromImmutable($fromDate),
        \DateTime::createFromImmutable($toDate),
    ];
}

周一和周日的returns日期(iso周数)。

如果您想知道星期日和星期六的日期,您可以轻松修改函数(将 'N' 替换为 format 中的 'w')并删除 -1

$WeekArray = array();

 $FirstDate = Carbon::now()->addYears(-2);
 $LastDate = Carbon::now()->addYears(2);

 while ($FirstDate <= $LastDate) {
    $WeekNumber = Carbon::parse($FirstDate)->weekOfYear;
    $WeekYear = Carbon::parse($FirstDate)->year;
    $StartOfWeek = Carbon::parse($FirstDate)->startOfWeek();
    $EndOfWeek = Carbon::parse($FirstDate)->endOfWeek(); 
    
    $WeekItem = new stdClass;
    $WeekItem->WeekNumber = $WeekNumber;
    $WeekItem->WeekYear = $WeekYear;
    $WeekItem->FirstDate = AppHelper::_DateFormatMysql($StartOfWeek);
    $WeekItem->LastDate = AppHelper::_DateFormatMysql($EndOfWeek);

    if (count($WeekArray) > 0) {
        if (collect($WeekArray)->where('WeekYear', $WeekItem->WeekYear)->where('WeekNumber', $WeekItem->WeekNumber)
                               ->where('FirstDate', $WeekItem->FirstDate)->where('LastDate', $WeekItem->LastDate)->count() == 0) 
        {
            array_push($WeekArray, $WeekItem);
        }
    }
    else {
        array_push($WeekArray, $WeekItem);
    }

    $FirstDate = Carbon::parse($FirstDate)->addDays(1);
 }