Генерация 4 раза с использованием даты начала и окончания с углеродом - PullRequest
0 голосов
/ 04 ноября 2018

Я делаю своего рода бесплатное приложение для спортивных ставок в своей школе. Люди могут прогнозировать результаты предстоящих футбольных игр и получать вознаграждение, если они верны.

Следующий шаг в моем приложении - определить, когда выбираются победители. Мне нужно выбрать 4 победителей за весь сезон. Я знаю дату начала и окончания сезона. Я хочу выбрать победителей в следующем порядке:

  • Первый победитель = 1/4 соревнования
  • Второй победитель = 2/4 соревнования
  • Третий победитель = 3/4 соревнования
  • Четвертый победитель = 4/4 соревнования

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

Примечание: я не хочу, чтобы победители выбирались во время матчей. Так что с пятницы до понедельника 23:59 не допускается. В основном, выбор победителя в конце игрового дня.

Я планировал использовать Carbon, но я не очень знаком с расчетами времени.

Код

public function handle()
{
    $this->updateStatus();

    $startDate = '2018-08-10';
    $endDate   = '2019-05-12';

    // need 4 times between startDate and endDate
}

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Вот мое мнение, основанное на вашем описании, надеюсь, оно даст вам представление о том, как использовать углерод:

Сначала создайте объекты Carbon по заданным датам:

$start = Carbon::createFromFormat('Y-m-d', '2018-08-10');
$end = Carbon::createFromFormat('Y-m-d', '2019-05-12');

// then calculated the difference in days
// using floor to get an exact number of days instead of floating point number. 
// for example here is 275 / 4 = 68.75 so the result will be 68
$days = floor($start->diffInDays($end) / 4); 

// use copy, because Carbon is mutable, which means if you don't use copy it 
// will modify the result on the original date.
$firstQuarter = $start->copy()->addDays($days);
while($firstQuarter->isWeekend()) {
    $firstQuarter->addDay();
}

$secondQuarter = $firstQuarter->copy()->addDays($days);
// do the same check to see if it is weekend or the days that you don't want.. 
// and continue the chain the same for third and last day should be the fourth quarter.

Не забудьте импортировать углерод в верхней части

Дайте мне знать, если это поможет:)

0 голосов
/ 05 ноября 2018

Это пример, который генерирует четыре даты между начальной и конечной датой с регулярными интервалами.

<?php

require "vendor/autoload.php";

use Carbon\Carbon;

$startDate = new Carbon('2018-08-10');
$endDate = new Carbon('2019-05-12');

$n = 4; // Number of dates

// difference (in days) between start date and end date divided by th number of dates 
// 5 make sure to generate dates in the range [startDate, endDate]
$diff = (int) $startDate->diffInDays($endDate) / $n - 5 ; 
$fourDate = [];
$newDate = clone $startDate;

for($i = 0; $i < $n; $i++) {

    $newDate->addDays($diff);

    switch ($newDate->dayOfWeek) {
        case 0:              //  0 (for Sunday)
            $newDate->addDays(2);
            break;
        case 1:             //  0 (for Monday)
            $newDate->addDays(1);
            break;
        case 5:             // 5 (for Friday)
            $newDate->addDays(4);
            break;
        case 6:             //  6 (for Saturday)
            $newDate->addDays(3);
            break;
        default:
            break;
    }
    $fourDate[] = $newDate->toDateString();
}

echo $startDate->toDateString() . PHP_EOL;
print_r($fourDate);
echo($endDate->toDateString());

выход

2018-08-10
Array
(
    [0] => 2018-10-16
    [1] => 2018-12-18
    [2] => 2019-02-19
    [3] => 2019-04-23
)
2019-05-12

без регулярных интервалов

<?php

require "vendor/autoload.php";

use Carbon\Carbon;

$startDate = new Carbon('2018-08-10');
$endDate = new Carbon('2019-05-12');

$n = 4; // Number of dates

// difference (in days) between start date and end date divided by th number of dates 
// 5 make sure to generate dates in the range [startDate, endDate]
$diff = (int) $startDate->diffInDays($endDate) / $n - 5 ; 
$fourDate = [];
$newDate = clone $startDate;

for($i = 0; $i < $n; $i++) {

    $newDiff = $diff - rand(1, $diff);

    $newDate->addDays($newDiff);

    switch ($newDate->dayOfWeek) {
        case 0:              //  0 (for Sunday)
            $newDate->addDays(2);
            break;
        case 1:             //  0 (for Monday)
            $newDate->addDays(1);
            break;
        case 5:             // 5 (for Friday)
            $newDate->addDays(4);
            break;
        case 6:             //  6 (for Saturday)
            $newDate->addDays(3);
            break;
        default:
            break;
    }
    $fourDate[] = $newDate->toDateString();
}

echo $startDate->toDateString() . PHP_EOL;
print_r($fourDate);
echo($endDate->toDateString());

выход

2018-08-10
Array
(
    [0] => 2018-09-18
    [1] => 2018-10-23
    [2] => 2018-11-06
    [3] => 2018-11-20
)
2019-05-12
...