碳:当知道年和年中的周时,得到一周的开始和结束日期


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

  • 年份:2016
  • 一年中的星期:42

作为结果,我需要这个星期的开始和结束日期。然而,我找不到一个合适的函数在碳文档

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

$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),
    ];
}

返回星期一和星期日的日期(iso周数)。

如果您希望知道星期日和星期六的日期,您可以轻松地修改函数(将format中的'N'替换为'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);
 }