繁体   English   中英

如何使用 PHP 比较数组中的上一个日期和下一个日期?

[英]How to compare previous date with next date in array using PHP?

我从早上 8 点到下午 5 点在数组中有这些日期时间输入

2022-09-23 08:00:00
2022-09-23 08:30:00
2022-09-23 09:00:00
2022-09-23 09:30:00
2022-09-23 10:00:00
2022-09-23 10:30:00
2022-09-23 11:00:00
2022-09-23 13:00:00
2022-09-23 13:30:00
2022-09-23 14:00:00
2022-09-23 14:30:00
2022-09-23 15:00:00
2022-09-23 16:00:00
2022-09-23 16:30:00
2022-09-23 17:00:00
2022-09-23 17:30:00

如果日期时间的输入大于前一个数组且小于下一个数组,我的目标是获取/输出前一个数组

Input datetime 2022-09-23 09:12:00, it will use 2022-09-23 09:00:00
Input datetime 2022-09-23 10:29:00, it will use 2022-09-23 10:00:00

我当前的代码:

$final_datetime = array();
$datetime = "2022-09-22 09:12:00";

foreach ($arr as $k => $v) {
  if ($v == $datetime) {
    $final_datetime[] = $v;
  } else {

    $next1="";
    $prev1="";

    // Previous Array
    if (isset($arr[$k-1])) {
      $prev1 = $arr[$k-1];
    }

    // Next Array
    if (isset($arr[$k+1])) {
      $next1 = $arr[$k+1];
    }

    $prev2 = date_create($prev1);
    $prev  = date_format($prev2, 'Y-m-d H:i:s'); 

    $next2 = date_create($next1);
    $next  = date_format($next2, 'Y-m-d H:i:s');

    if ($datetime > $prev && $datetime < $next) {
      echo 'Output : '.$prev.'<br/>';
    } else {
      
    }

  }
}

我目前的 output:

Output : 2022-09-22 08:30:00
Output : 2022-09-22 09:00:00

预期 Output:

Output : 2022-09-22 09:00:00

使用date_format返回一个字符串,但您想比较给定格式'Ymd H:i:s' DateTime对象

关于代码的一些注释。

  • 您在数组中使用2022-09-23 ,但变量$datetime = "2022-09-22 09:12:00"; 是前一天的
  • 当您实际上是指上一个数组项时,将评论放在Previous Array中可能会造成混淆
  • 如果您只想返回一个项目,那么您应该返回数组$final_datetime的最后一项或将$final_datetime字符串并在每次有新匹配时覆盖该值。 由于您仅使用单个值来检查和按顺序排列时隙,因此您只需覆盖该值
  • 在代码末尾比较日期时间时,您可以先检查 scope 中的变量值

示例代码

$datetimeStr = "2022-09-23 09:12:00";
$final_datetime = "$datetimeStr is not within timeslots.";
$format = 'Y-m-d H:i:s';
$d = DateTime::createFromFormat($format, $datetimeStr);

foreach ($arr as $k => $v) {
    if ($v === $datetimeStr) {
        $final_datetime = $v;
        break;
    } else {
        $prevDatetime = false;
        $nextDateTime = false;
        $prevStr = "";
        $nextStr = "";

        if (isset($arr[$k - 1])) {
            $prevStr = $arr[$k - 1];
        }
        if (isset($arr[$k + 1])) {
            $nextStr = $arr[$k + 1];
        }
        if ($prevStr) {
            $prevDatetime = DateTime::createFromFormat($format, $prevStr);
        }
        if ($nextStr) {
            $nextDateTime = DateTime::createFromFormat($format, $nextStr);
        }

        if ($prevDatetime && $nextDateTime && $d && ($d > $prevDatetime && $d < $nextDateTime)){
            $final_datetime = $prevStr;
        }
    }
}

echo "Output: " . $final_datetime;

结果

Output: 2022-09-23 09:00:00

请参阅php 演示

您使用date_create()在正确的轨道上,最简单的方法是将输入日期时间添加到数组中,然后使用array_map()将所有内容转换为DateTime然后将其传递给sort() 然后您所要做的就是在数组中搜索输入DateTime 如果它是数组中的第一项或最后一项,则表示其超出范围。 下面,我将该过程写入 function 中,如果日期时间超出范围,则返回false (顺便说一句,您的示例搜索范围之外的日期时间)。

function findTimeSlotFor(string $dt_str, array $ts_arr)
{
  if (in_array($dt_str, $ts_arr))
    // return exact string match
    return $dt_str;
  
  // add it to the array
  $ts_arr[] = $dt_str;
  // convert to DateTimes
  $dt_arr = array_map('date_create', $ts_arr);
  $dt = date_create($dt_str);
  
  // sort the array
  sort($dt_arr);
  // find where it landed
  $landed_at_index = array_search($dt, $dt_arr);

  if(0 == $landed_at_index || array_key_last($dt_arr) == $landed_at_index){
    // input datetime outside the range of datetimes in the array
    // adjust to your logic
    return false;
  }
  // return the one before
  return $dt_arr[$landed_at_index - 1]->format('Y-m-d H:i:s');
}

在此处查看上述代码: https://onlinephp.io/c/2cc7a

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM