Php 从特定日期的半小时列表中排除特定半小时
我正在开发预约系统,有一个表单可以从用户那里收集开始日期和结束日期,以检查顾问的可用性,假设您选择开始日期为3月27日,结束日期为3月29日,这是三天,那么我将显示三行,每行包含办公室的工作时间,每半小时一次预订会议,这就是它的样子 显示的计时应该隐藏已预订的时段 我可以很好地显示每天的可用时间,但如果会议已预订,比如3月28日下午2:00-02-30,则此时间将隐藏在所有日期中,仅3月28日除外 以下是我用于此目的的代码Php 从特定日期的半小时列表中排除特定半小时,php,arrays,date,datetime,for-loop,Php,Arrays,Date,Datetime,For Loop,我正在开发预约系统,有一个表单可以从用户那里收集开始日期和结束日期,以检查顾问的可用性,假设您选择开始日期为3月27日,结束日期为3月29日,这是三天,那么我将显示三行,每行包含办公室的工作时间,每半小时一次预订会议,这就是它的样子 显示的计时应该隐藏已预订的时段 我可以很好地显示每天的可用时间,但如果会议已预订,比如3月28日下午2:00-02-30,则此时间将隐藏在所有日期中,仅3月28日除外 以下是我用于此目的的代码 <?php $start = new DateT
<?php
$start = new DateTime('09:00:00');
$end = new DateTime('16:00:01'); // add 1 second because last one is not included in the loop
$interval = new DateInterval('PT30M');
$period = new DatePeriod($start, $interval, $end);
$existing_time = array(
array(
'start_time' => '2014-03-28T14:00:00+1100',
'end_time' => '2014-03-28T14:30:00+1100'
),
array(
'start_time' => '2014-03-28T15:00:00+1100',
'end_time' => '2014-03-28T15:30:00+1100'
)
);
?>
<div id="accordion2" class="accordion">
<?php for ($i = 0; $i < 3; $i++) {
?>
<div class="accordion-group">
<div class="accordion-heading">
<a href="#collapse<?php echo $i ?>" data-parent="#accordion2" data-toggle="collapse"
class="accordion-toggle collapsed">
<?php echo date('Y-m-d', strtotime('2014-03-27' . ' + ' . $i . ' day')) ?>
</a>
</div>
<div class="accordion-body collapse" id="collapse<?php echo $i ?>" style="height: 0px;">
<div class="accordion-inner">
<?php
$booked = array();
foreach ($existing_time as $ex) {
$dt = new DateTime($ex['start_time']);
$booked[] = $dt->format('h:ia');
}
$previous = '';
foreach ($period as $dt) {
$current = $dt->format("h:ia");
if (!empty($previous) && !in_array($previous, $booked)) {
echo "<input name='time' type='radio' value='{$previous}|{$current}'> {$previous}-{$current}<br/>";
}
$previous = $current;
}
?>
</div>
</div>
</div>
<?php } ?>
</div>
只是想澄清一下,如果一个会议预定了一天,那么它会被隐藏一整天吗?你不想这样吗?@johncode是的,你是对的。我还需要查看与此相关的其他代码。@johncode请查看更新的代码,希望这会有所帮助,我也在使用twitter引导程序。你将开始日期定为今天吗<代码>$start=新日期时间('09:00:00')代码>在此代码中,是。当然,你可以很容易地使用它来改变。你知道这为什么不起作用吗<代码>$start_date->setDate(2014,03,21)$开始日期->格式('Y-m-d')$开始日期=新日期时间('09:00:00')代码>最后一行覆盖前两行。尝试:$start\u date->setDate(2014,03,21)$开始日期->设置时间(9,0);echo$start_date->格式('Y-m-d H:i:s')代码>你是一个天才,做了一些调整后效果很好:)非常感谢你。。。。。真是太感谢你了
<?php
$start = new DateTime('09:00:00');
$interval = new DateInterval('PT30M');
$existing_time = array(
array(
'start_time' => '2014-03-21T14:00:00+1100',
'end_time' => '2014-03-21T14:30:00+1100'
),
array(
'start_time' => '2014-03-20T15:00:00+1100',
'end_time' => '2014-03-20T15:30:00+1100'
)
);
$booked = array();
foreach ($existing_time as $ex) {
$dt = new DateTime($ex['start_time']);
$booked[] = $dt->format('Y-m-d h:ia');
}
for ($i = 0; $i < 3; $i++) {
if (0 !== $i) {
$start->modify("+1 day");
$start->setTime(9, 0);
}
$end = clone $start;
$end = $end->setTime(16, 1); // add 1 second because last one is not included in the loop
$previous = null;
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $dt) {
$current = $dt->format("h:ia");
if (!empty($previous)) {
$pr_short = $previous->format("h:ia");
$pr_long = $previous->format("Y-m-d h:ia");
if (!in_array($pr_long, $booked)) {
echo "<input name='time' type='radio' value='{$pr_short}|{$current}'> {$pr_short}-{$current}<br/>";
}
}
$previous = $dt;
}
}