Carbon 在两周范围日期后的一周内获得兴趣

Carbon get interested week in two weeks range date

我正在尝试编写一种算法,根据日期范围计算感兴趣的周(星期六到星期六)。 例如我有这个范围:

2018-01-04 to 2018-01-13

在这种情况下,我有两周的利息,它是:"week 1" 从 1 月 1 日到 07 日和 "week 2" 从同一个 1 月 08 日到 14 日。

在这种情况下,算法会回复我感兴趣的周是 "Week 2",因为该周的天数高于 "week 1" 中的天数。

我如何在 Carbon 中执行此操作?

  • 假设您将开始日期和结束日期作为 Carbon 对象 $s$e
  • 确保差异小于 14 天
  • 计算重叠:
    • $s->diffInDays($s->copy()->startOfWeek()) "offset" 进入第一周
    • $e->copy()->endOfWeek()->diffInDays($e) "remainder" 上周
  • if $offset > $remainder select $e;否则 select $s
  • 输出$selectedWeek->copy()->startOfWeek()$selectedWeek->copy()->endOfWeek()

显然,startOfWeek()endOfWeek() 改变了对象;所以在使用这些方法之前一定要copy()

实施:

$s = new Carbon\Carbon('2018-01-04');
$e = new Carbon\Carbon('2018-01-13');
$diff = $e->diffInDays($s);
if ($diff > 14) die("uh-oh!");
$offset = $s->diffInDays($s->copy()->startOfWeek());
$remainder = $e->copy()->endOfWeek()->diffInDays($e);
$selectedWeek = ($offset > $remainder ? $e : $s)->copy()->startOfWeek();
echo "selected week {$selectedWeek->weekOfYear} ({$selectedWeek} - {$selectedWeek->copy()->endOfWeek()})";

输出:

selected week 2 (2018-01-08 00:00:00 - 2018-01-14 23:59:59)

我想你可以做这样的事情。我还没有测试过,但你可以得到一些想法。另外我想指出文档 https://carbon.nesbot.com/docs/

// Create dates
$date1 = Carbon::create(2018, 1, 4, 0, 0, 0);
$date2 = Carbon::create(2018, 1, 13, 0, 0, 0);

// Get The week numbers
$week_date_1 = $date1->weekOfYear; 
$week_date_2 = $date2->weekOfYear; 

// Count number of days for each week
$number_of_days_week_1 = $date1->diffInDays($date1->startOfWeek); 
$number_of_days_week_2 = $date2->diffInDays($date2->startOfWeek); 

// Highest number of days per week wins
if($number_of_days_week_1 > $number_of_days_week_2){
   return $week_date_1; 
} else {
   return $week_date_2; 
}