【问题标题】:PHP: Generate Carbon array with opening and closing times (per day)PHP:生成具有打开和关闭时间的碳数组(每天)
【发布时间】:2017-06-03 22:05:09
【问题描述】:

想要的结果

我想要一个关联数组,其中包含间隔为 15 分钟的时间范围(在开始时间和结束时间之间)。例如:

[
    '2017-01-16' => [ // Start of the week (Monday)
        '08:00', // Opening time
        '08:15',
        '08:30',
        // Etc..
        '18:00', // Closing time
    ],
    '2017-01-17' => [ // Tuesday
        '10:00', // Opening time
        '10:15',
        '10:30',
        // Etc..
        '22:00', // Closing time
    ],

    // For every day in the week.
];

我想做的另一件事是:取一个时间范围(例如09:00 - 10:00)并将其从数组中删除(在特定日期键处)

我做的步骤(到目前为止)

我有一个看起来和上面一样的数组。但是.. 它以00:00 开头,以23:45 结尾。使用以下代码(主要来自 Stackoverflow 的另一个问题):

private function generateDateRange(Carbon $start_date, Carbon $end_date)
{
    $dates = [];

    while ($start_date->lte($end_date)) {

        if(! array_key_exists($start_date->format('Y-m-d'), $dates)) {
            $dates[$start_date->format('Y-m-d')] = [];
        } else {

            array_push($dates[$start_date->format('Y-m-d')], $start_date->format('H:i'));

            if(in_array($start_date->format('H:i'), $dates[$start_date->format('Y-m-d')])) {
                $start_date->addMinutes(15);
            } else {
                $start_date->addDay();
            }


        }
    }

    return $dates;
}

$start = Carbon::now()->startOfWeek();
$end = Carbon::now()->endOfWeek();

$range = $this->generateDateRange($start, $end);

我的问题

如何在 PHP (Laravel) 中做到这一点?我计划通过使用数据库来使这个(更多)动态化。但首先我想有一个工作基础。

有人知道我可以做些什么来达到预期的结果吗?

【问题讨论】:

  • 你希望输出是什么样的?
  • 作为想要的结果下的数组。它应该以一周中的每一天为键,并且该键包含打开和关闭时间之间的时间范围(间隔为 15 分钟)。这应该是每天的动态(关键)。
  • 啊,是的,对不起,我虽然那是你的来源。所以你想传入一个开始日期和时间(例如'2017-01-16 08:00')和结束时间(例如'2017-01-16 18:00')并获得一个每15分钟插槽的数组之间?
  • 没错。这应该是每天的动态开盘和收盘范围。

标签: php laravel date time php-carbon


【解决方案1】:

试试这个:

private function generateDateRange(Carbon $start_date, Carbon $end_date,$slot_duration = 15)
{
    $dates = [];
    $slots = $start_date->diffInMinutes($end_date)/$slot_duration;

    //first unchanged time
    $dates[$start_date->toDateString()][]=$start_date->toTimeString();

    for($s = 1;$s <=$slots;$s++){

        $dates[$start_date->toDateString()][]=$start_date->addMinute($slot_duration)->toTimeString();

    }

    return $dates;
}

【讨论】:

  • 我在哪里说特定的一天应该从08:00 开始并在18:00 结束?
  • 通过$start_date = '2017-01-16 08:00'
猜你喜欢
  • 2021-07-14
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
相关资源
最近更新 更多