在 PHP 中为给定小时添加 15 分钟间隔



我有一个集合,其中包含像这样的商店的开盘和关门时间:

"Monday" => array:2 [▶]
"Tuesday" => array:2 [▼
"open_at" => "09:00"
"close_at" => "18:00"
]
"Wednesday" => array:2 [▶]
"Thursday" => array:2 [▶]
"Friday" => array:2 [▶]
"Saturday" => array:2 [▶]
"Sonday" => array:2 [▶]

我想在店主决定的每一天时间间隔(约会(中添加。假设每 15 分钟。我想得到这样的东西:

"Tuesday" => array:2 [▼
"open_at" => "09:00"
2  => "09:15"
3  => "09:30"
.... all in between...
31  => "17:30"
32  => "17:45"
"close_at" => "18:00"
]

我的问题是数据类型是字符串。 我试图用碳解析它(我正在使用拉拉维尔(,但我得到错误:

Trailing Data. Data Missing

我尝试使用纯PHP,但我惊讶于(strtotime('00:15:00')等于1576023300而不是54000秒。

无论如何,我继续这样做:

if($weekdays[ $index] === 'Tuesday') {
$open = strtotime($day->open_at);
$close = strtotime($day->close_at);
$interval = array();
// I get 15 minutes in seconds: (strtotime('00:15:00')) == 1576023300 
for ($i=$open; $i < $close; $i + 1576023300) { 
$interval[$i] = gmdate("H:i", $i);
}
};

但我不明白。而这种来回和前进,加上循环和if()功能非常容易出错。

我的问题是:

(
  • strtotime('00:15:00'(等于1576023300而不是54000秒是否正确?
  • 有没有更聪明/神奇的方法可以在给定的小时内增加 15 分钟,直到它到达结束小时?

您可以使用DateTimeDateInterval类来做到这一点。

if ($weekdays[$index] === 'Tuesday') {
$tuesday = [
'open_at' => $day->open_at, // 09:00
'close_at' => $day->close_at, // 18:00
];
$interval = (new DateTime($day->open_at))->add(new DateInterval('PT15M'))->format('H:i'); // adds 15 mins to 09:00
$i = 2; //index
while ($interval < '18:00') {
$tuesday[$i] = $interval;
$interval = (new DateTime($interval))->add(new DateInterval('PT15M'))->format('H:i');
$i++;
}
};

最后你可以订购$tuesdayasort($tuesday);.

请参阅此处的工作示例。

希望这能解决您对问题的回答:)

$str_time = "00:15:00";
$str_time = preg_replace("/^([d]{1,2}):([d]{2})$/", "00:$1:$2", $str_time);
sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds);
$time_seconds = $hours * 3600 + $minutes * 60 + $seconds;

这是一个相当简单的实现(只有 2 天用于测试目的(。这会将所有开始时间(包括open_at(添加到带有数字索引的数组中,以便更轻松地迭代它们:

$days = array('Monday'  => array('open_at' => '09:00', 'close_at' => '18:00'),
'Tuesday' => array('open_at' => '11:00', 'close_at' => '14:00')
);
foreach ($days as &$day) {
$time = new DateTime($day['open_at']);
$close = new DateTime($day['close_at']);
while ($time < $close) {
$day[] = $time->format('H:i');
$time->modify('+15 minutes');
}
}
print_r($days);

输出:

Array
(
[Monday] => Array
(
[open_at] => 09:00
[close_at] => 18:00
[0] => 09:00
[1] => 09:15
[2] => 09:30
[3] => 09:45
[4] => 10:00
[5] => 10:15
[6] => 10:30
[7] => 10:45
[8] => 11:00
[9] => 11:15
[10] => 11:30
[11] => 11:45
[12] => 12:00
[13] => 12:15
[14] => 12:30
[15] => 12:45
[16] => 13:00
[17] => 13:15
[18] => 13:30
[19] => 13:45
[20] => 14:00
[21] => 14:15
[22] => 14:30
[23] => 14:45
[24] => 15:00
[25] => 15:15
[26] => 15:30
[27] => 15:45
[28] => 16:00
[29] => 16:15
[30] => 16:30
[31] => 16:45
[32] => 17:00
[33] => 17:15
[34] => 17:30
[35] => 17:45
)
[Tuesday] => Array
(
[open_at] => 11:00
[close_at] => 14:00
[0] => 11:00
[1] => 11:15
[2] => 11:30
[3] => 11:45
[4] => 12:00
[5] => 12:15
[6] => 12:30
[7] => 12:45
[8] => 13:00
[9] => 13:15
[10] => 13:30
[11] => 13:45
)
)

3v4l.org 演示

最新更新