字符串格式的PHP日期时间操作

字符串格式的PHP日期时间操作,php,time,Php,Time,我的系统中有几个商店。现在,我想在网上展示已经开业或即将开业的店铺,如果现在时间早于关门时间。我使用的时间字符串是24小时格式,如“01:00”和“23:22”。我想出了如下代码: public function willOpen($open, $closed, $nowTime) { $open = str_replace(":", "", $open); $closed = str_replace(":", "", $closed); $nowTime = s

我的系统中有几个商店。现在,我想在网上展示已经开业或即将开业的店铺,如果现在时间早于关门时间。我使用的时间字符串是24小时格式,如“01:00”和“23:22”。我想出了如下代码:

    public function willOpen($open, $closed, $nowTime) {
    $open = str_replace(":", "", $open);
    $closed = str_replace(":", "", $closed);
    $nowTime = str_replace(":", "", $nowTime);
    if ($open >= $nowTime) {
        if ($closed <= $nowTime) {
            return false;
        } else {
            return true;
        }
    }
    return false;
}
function willOpen(Datetime $open, Datetime $closed)
{
    $nowTime = new DateTime(); # defaults to now 

    // if ($nowTime > $closed) ...
}

$open   = Datetime::createFromFormat('H:i', '01:00');
$closed = Datetime::createFromFormat('H:i', '09:00');
公共函数将打开($open、$closed、$nowTime){
$open=str_replace(“:”,“,$open”);
$closed=str_replace(“:”,“,$closed”);
$nowTime=str_replace(“:”,“,$nowTime”);
如果($open>=$nowTime){

如果($closed,我会将所有日期转换为unix时间,并从中进行比较。它更准确,专为这类事情而设计。日期(“U”)是自epoc以来的unix时间(并且是一个整数),因此比较>和<就轻而易举了

$open = date("U",strtotime($open));
$closed = date("U",strtotime($closed));
$nowTime = date("U");
if ($open >= $nowTime) {
 if ($closed <= $nowTime) {
  return false;
 }
 else {
  return true;
 }
}
return false;
$open=日期(“U”,标准时间($open));
$closed=日期(“U”,标准时间($closed));
$nowTime=日期(“U”);
如果($open>=$nowTime){

如果($closed最好的方法是使用DateTime类,因为时间操作是受支持的。所以应该是这样的:

    public function willOpen($open, $closed, $nowTime) {
    $open = str_replace(":", "", $open);
    $closed = str_replace(":", "", $closed);
    $nowTime = str_replace(":", "", $nowTime);
    if ($open >= $nowTime) {
        if ($closed <= $nowTime) {
            return false;
        } else {
            return true;
        }
    }
    return false;
}
function willOpen(Datetime $open, Datetime $closed)
{
    $nowTime = new DateTime(); # defaults to now 

    // if ($nowTime > $closed) ...
}

$open   = Datetime::createFromFormat('H:i', '01:00');
$closed = Datetime::createFromFormat('H:i', '09:00');
如果第二天就关门了,那么你可能会有点像:

$closed->add(new DateInterval('P1DT12H')); # 1 day + 12 hours

当一家商店早上8点到12点开门,中午关门,下午3点到6点(15:00-18:00)再开门时,你会怎么做?我想你需要一个多个打开/关闭窗口。当每天都打开/关闭这些窗口时。在你上面的例子中,应该在上午11点打开,23:59关闭,0:00打开,01:00关闭。这需要一些重写,但我不认为一个简单的打开/关闭就可以覆盖所有…(当然,在德国不是这样!)同样,每个工作日的时间可能不同!但它也会处理上午时间吗?就像在示例中一样,我会这样做,不过您可能也想在其中输入一个日期。例如:$open=date(“U”,strotime(date(“Y-m-d”)。$open));为什么?我知道如果一家商店9:00开门,2:00关门,那么2:00将被视为第二天。这就是为什么我没有这样做。但这样做不会真正匹配,因为02:00在09:00之前。如果比较“时间”,这就是问题所在啊,这看起来不错,我要试试这种方法为什么1天12小时……24小时不可能?什么是1天12小时?@rZaaaa这只是一个例子。