php store hours脚本,无法让午夜正常工作

时间:2017-04-28 19:52:49

标签: php

我有这个简单的商店小时PHP脚本。

您可以在数组中的商店的营业时间添加。

然后你在页面上回复它。

但是我有例如上午10:00到凌晨12:00 ..它打破了逻辑。

它应该说我们已经开放......但它说我们已经关闭了。

它适用于一天中的每一个时间..但是午夜有些不对劲。

请帮帮忙?我可能看不到容易的东西。

<?php        

date_default_timezone_set('America/New_York');


$storeSchedule = [
    'Monday' => ['10:00 AM' => '11:00 PM'],
    'Tuesday' => ['10:00 AM' => '11:00 PM'],
    'Wednesday' => ['10:00 AM' => '11:00 PM'],
    'Thursday' => ['10:00 AM' => '11:00 PM'],
    'Friday' => ['10:00 AM' => '12:00 AM'],
    'Saturday' => ['10:00 AM' => '12:00 AM'],
    'Sunday' => ['10:00 AM' => '11:00 PM']
];


$timestamp = time();

$status = '<span style="color:#fc2323">Closed now</span>';

$currentTime = (new DateTime())->setTimestamp($timestamp);

foreach ($storeSchedule[date('l', $timestamp)] as $startTime => $endTime) {

    $startTime = DateTime::createFromFormat('h:i A', $startTime);
    $endTime   = DateTime::createFromFormat('h:i A', $endTime);

    if (($startTime < $currentTime) && ($currentTime < $endTime)) {
        $status = '<span style="color:#23fc41">OPEN</span>';
        $todayIs = "owen";
        break;
    }
}

echo '<p style="padding-bottom:5px;">Hours: ' . $status . '</p>';

foreach($storeSchedule[date('l', $timestamp)] as $openHour => $closeHour) { 

    echo "<p style='padding-bottom:15px' class=\"show-store-hours\">" . date('l') . ": " . $openHour . " - " . $closeHour . " &#43;</p>";

}

echo '<ul class="store-hours" style="margin: 0 auto; padding-bottom:25px">';

foreach ($storeSchedule as $storeDay => $hoursArray) {

    foreach ($hoursArray as $startTime => $endTime) {

        echo '<li>';
        echo $storeDay;
        echo ': <span>';
        echo $startTime;
        echo ' - ';
        echo $endTime;
        echo '</span></li>';

    }       

}

echo '<div class="clr"></div></ul>';

&GT;

3 个答案:

答案 0 :(得分:0)

如果结束时间是午夜,那么尝试将1天添加到您的结束时间怎么样?我想你已经看到了这个结果,因为午夜时间实际上比所有开始时间都少。例如,星期五上午10点到午夜实际上(时间明智)相当于星期五上午10点到星期六上午12点。

还有另一种解决方法。您可以将截止时间发布为晚上11:59:59,并显示午夜时间。

要修复您的结束时间,您可以

if ($endtime < $starttime) { $endtime=date_add($endtime, INTERVAL 1 DAY);}

答案 1 :(得分:0)

不确定这是否是最好的解决方法......

但这对我有用..感谢您的帮助。

if ( $endTime == "11:59 PM" ) { 
 $endTime = "12:00 AM";
}

在我已经存储了OPEN或CLOSED值之后,我在页面上回显了这个。

答案 2 :(得分:0)

您可以从H:i格式字符串开始比较dateTime对象,然后将它们格式化回g:i A

区别在于:

午夜为H:i

$a = DateTime::createFromFormat('H:i', '24:00');
print_r($a);
DateTime Object
(
    [date] => 2017-04-30 00:00:00.000000
    [timezone_type] => 3
    [timezone] => Asia/Dubai
)

午夜为g:i A

$a = DateTime::createFromFormat('g:i A', '12:00 AM');
print_r($a);
DateTime Object
(
    [date] => 2017-04-29 00:00:00.000000
    [timezone_type] => 3
    [timezone] => Asia/Dubai
)

所以,你可以这样做:

$a = DateTime::createFromFormat('H:i', '10:00');
$b = DateTime::createFromFormat('H:i', '24:00');
$c = new DateTime();
var_dump($c > $a && $c < $b);
  

BOOL(真)

并将dateTime对象格式化回&#34; 12:00 AM&#34;格式:

print($b->format('g:i A'));
  

12:00 AM