Карбон заинтересовался неделей в двухнедельном диапазоне - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь написать алгоритм, который рассчитывает интересующую неделю (с субботы по субботу) на основе диапазона дат. Например, у меня есть этот диапазон:

2018-01-04 до 2018-01-13

В этом случае у меня есть две недели интереса, это: "неделя 1" с 01 по 07 января и "неделя 2" с 08 по 14 того же января.

В этом случае алгоритм ответит мне, что интересующей неделей является «Неделя 2», поскольку количество дней в этой неделе больше, чем количество дней в «неделе 1».

Как я могу сделать это в Carbon?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Полагаю, вы могли бы сделать что-то подобное. Я не проверял это, но вы можете получить некоторую идею. Также я бы хотел указать на документацию 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; 
}
0 голосов
/ 03 мая 2018
  • Предполагая, что у вас есть начальная и конечная даты в виде объектов Carbon $s и $e
  • убедитесь, что разница составляет менее 14 дней
  • рассчитать перекрытия:
    • $s->diffInDays($s->copy()->startOfWeek()) "смещение" в первую неделю
    • $e->copy()->endOfWeek()->diffInDays($e) «остаток» прошлой недели
  • если $offset > $remainder выберите $e; еще выберите $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)
...