Как запрограммировать событие раз в две недели в Laravel - PullRequest
0 голосов
/ 30 апреля 2020

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

Теперь еженедельно и ежемесячно все просто - у меня задание cron выполняется каждый день, и если кто-то устанавливает значение «еженедельно», я просто проверяю, является ли день понедельником. Если это ежемесячно, я проверяю, является ли день месяца 1.

Но раз в две недели это немного сложнее. Моей первой мыслью было проверить, не понедельник ли это, а затем проверить, прошло ли четное количество недель с начала года. Я не уверен на 100% в этом, но я уверен, что есть вероятность того, что, когда год переключится, у вас может быть 2 недели подряд, когда это срабатывает, или две недели подряд, когда это не происходит. триггер.

Моя другая идея, которая потенциально преодолевает это, состоит в том, чтобы проверить, было ли это четное количество недель с определенной даты в прошлом, скажем, с 1 января 2020 года.

Оба из этих логик c, на мой взгляд, потребовалось бы использовать Carbon для получения ->diffInDays(), разделить его на 7, получить результат и проверить, является ли результат четным или нечетным. Я просто хотел проверить, является ли какая-либо из этих идей хорошим способом реализации «раз в две недели» или мне нужно подумать о чем-то другом.

1 Ответ

0 голосов
/ 07 мая 2020

Я думаю, что ваша вторая идея в порядке. Я использую в качестве даты в прошлом 1 января 1970 года.

Вам не нужен углерод. Собственный DateTime работает отлично.

$strDate = 'today';
//$strDate = '2020-05-04';  //for test
//$strDate = '2020-05-11';  //for test

$curDate = date_create($strDate);
$biweekly = ((int)(date_create('@0')->diff($curDate)->days/7))%2;
//result is 0 or 1

$start = ($biweekly AND $curDate->format('w') == 1); //true for every 2nd Monday

Если вы хотите использовать другую неделю, выполните:

$start = ($biweekly == 0 AND $curDate->format('w') == 1);

Другой вариант принимает указанную дату c с желаемым днем ​​недели в качестве Дата начала. Существует двухнедельный цикл, если разница между днями от даты начала до текущего дня делится на 14 без отдыха.

$startDate = '2020-05-04';  //a monday
$ev14Days = date_create($startDate)->diff(date_create('today'))->days%14 == 0;
//true on 2020-05-18, 2020-06-01, ..
...