Начало дня в отпуске БД - (Carbon, Laravel)

Итак, у меня есть следующий код:

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.

Как это можно исправить, я не могу найти хорошую документацию по этому поводу?

Вы сохранили $event start & end , $holiday start & end в виде даты и времени или строкового формата Ymd ?

Win 26.01.2023 19:08

Я не уверен, что понимаю, чего вы хотите достичь с помощью цикла while? и когда будет использоваться $eventEnd?

Win 26.01.2023 19:15

@Win Итак, я думаю, что нашел основную причину проблемы. Я храню даты праздников так Y-m-d. например 2023-02-21 Теперь, если я dd($companyHolidays) это показывает так "start" => "2023-02-19T23:00:00.000000Z", так что всегда есть смещение. Любая идея, что может вызвать это?

Nifty Matrix 26.01.2023 20:15

вот как 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 27.01.2023 05:27

@Win Спасибо за этот ответ! :) Это действительно решает мою проблему. Большое спасибо!!!

Nifty Matrix 27.01.2023 08:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С помощью @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

Другие вопросы по теме