[英]How to get previous and next date compared to an array of dates in 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
字符串并在每次有新匹配时覆盖该值。 由于您仅使用单个值来检查和按顺序排列时隙,因此您只需覆盖该值示例代码
$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.