Итак, у меня есть следующий код:
use Carbon\ Carbon;
use Carbon\ CarbonPeriod;
use App\ Models\ Holiday;
// grab holidays of current year
$holidays = app('yasumi');
$holidaysArray = $holidays - > getHolidayDates();
$eventRepeats = $event - > repeats;
foreach($holidays - > getHolidayDates() as $date) {
echo '<br>';
echo $date.PHP_EOL;
echo '<br><br>';
}
// make Carbon out of event times
$eventStart = Carbon::parse($event - > start);
$eventEnd = Carbon::parse($event - > end);
// get custom holidays
$companyHolidays = Holiday::query() - > get() - > toArray();
$customholidayArray = [];
foreach($companyHolidays as $holiday) {
$parsedCompanyHolidays = CarbonPeriod::create($holiday['start'], $holiday['end']) - > toArray();
foreach($parsedCompanyHolidays as $parsedHoliday) {
$customholidayArray[] = $parsedHoliday - > translatedFormat('Y-m-d');
}
}
проблема в CarbonPeriod::create($holiday['start']. Это Y-m-d, но мне нужно, чтобы также было начало дня 00:00:00 и в конце мне нужно 23:59:59
Я использую эти данные, чтобы пропускать даты в цикле while. Текущее решение работает неправильно и отстает на один день из-за пропущенных часов, минут и секунд.
Вот петля:
while ($i < $eventRepeats) {
// add one week
$eventStart - > addDays(7);
if (in_array($eventStart - > translatedFormat('Y-m-d'), $holidaysArray)) {
continue;
}
}
РЕДАКТИРОВАТЬ, возможно, нашел основную причину, но нет решения:
Если я dd($companyHolidays); это показывает так "start" => "2023-02-19T23:00:00.000000Z"
хотя дата хранится в БД, например, 2023-02-20.
Как это можно исправить, я не могу найти хорошую документацию по этому поводу?
Я не уверен, что понимаю, чего вы хотите достичь с помощью цикла while? и когда будет использоваться $eventEnd?
@Win Итак, я думаю, что нашел основную причину проблемы. Я храню даты праздников так Y-m-d. например 2023-02-21 Теперь, если я dd($companyHolidays) это показывает так "start" => "2023-02-19T23:00:00.000000Z", так что всегда есть смещение. Любая идея, что может вызвать это?
вот как laravel обрабатывает поле datetime, вам нужно использовать $casts внутри вашей модели Holiday protected $casts = ['start' => 'datetime:Y-m-d', 'end' => 'datetime:Y-m-d'];, чтобы удалить детализацию времени и часовой пояс, прочитайте документ laravel.com/docs/9.x/eloquent-mutators#date -кастинг
@Win Спасибо за этот ответ! :) Это действительно решает мою проблему. Большое спасибо!!!






С помощью @Win я смог решить эту проблему.
Все, что мне нужно было изменить, это protected $casts в моей модели из:
protected $casts = [
'start' => 'date',
'end' => 'date',
];
к:
protected $casts = [
'start' => 'datetime:Y-m-d',
'end' => 'datetime:Y-m-d'
];
Дополнительную информацию об этой проблеме можно найти здесь: https://laravel.com/docs/9.x/eloquent-mutators#date-casting
Вы сохранили $event start & end , $holiday start & end в виде даты и времени или строкового формата Ymd ?