如何在PHP中获取与日期数组相比最接近的日期

kq4fsx7k  于 2023-02-11  发布在  PHP
关注(0)|答案(6)|浏览(103)

This post几乎为我回答了这个问题,但我有一个特定的需求,并没有找到我所寻求的。我不能完全理解它,所以我真正需要的是一个正确的方向。
假设我有一个如下的数组:

array(5) { 
    [0]=> "2013-02-18 05:14:54" 
    [1]=> "2013-02-12 01:44:03" 
    [2]=> "2013-02-05 16:25:07" 
    [3]=> "2013-01-29 02:00:15" 
    [4]=> "2013-01-27 18:33:45" 
}

我希望有一种方法来提供日期(例如“2013-02-04 14:11:16”),并让一个函数确定数组中与此最接近的匹配(在本例中为“2013-02-05 16:25:07”)。
我会很感激任何提示。谢谢!:)

rjzwgtxy

rjzwgtxy1#

我可能没有最好的命名惯例,但这里开始。
我计算日期数组与给定日期之间的间隔,然后进行排序,以找到“最小”差异。

$dates = array
(
    '0'=> "2013-02-18 05:14:54",
    '1'=> "2013-02-12 01:44:03",
    '2'=> "2013-02-05 16:25:07",
    '3'=> "2013-01-29 02:00:15",
    '4'=> "2013-01-27 18:33:45"
);

function find_closest($array, $date)
{
    //$count = 0;
    foreach($array as $day)
    {
        //$interval[$count] = abs(strtotime($date) - strtotime($day));
        $interval[] = abs(strtotime($date) - strtotime($day));
        //$count++;
    }

    asort($interval);
    $closest = key($interval);

    echo $array[$closest];
}

find_closest($dates, "2013-02-18 05:14:55");
oknwwptz

oknwwptz2#

如果我完全理解你的问题,那么这将解决你的问题。

受试代码

<?php
    $dates = array
    (
        '0' => "2013-02-18 05:14:54",
        '1' => "2013-02-12 01:44:03",
        '2' => "2013-02-05 16:25:07",
        '3' => "2013-01-29 02:00:15",
        '4' => "2013-01-27 18:33:45"
    );

    function closest($dates, $findate)
    {
        $newDates = array();

        foreach($dates as $date)
        {
            $newDates[] = strtotime($date);
        }

        echo "<pre>";
        print_r($newDates);
        echo "</pre>";

        sort($newDates);
        foreach ($newDates as $a)
        {
            if ($a >= strtotime($findate))
                return $a;
        }
        return end($newDates);
    }

    $values = closest($dates, date('2013-02-04 14:11:16'));
    echo date('Y-m-d h:i:s', $values);
?>
mrphzbgm

mrphzbgm3#

假设您的数组更大,并且日期范围在2009-10-012019-10-01之间,现在让我们比较两种方法:a. looping-array approach对B. sorting-indexing-array approach

<?php 

$period = new DatePeriod(
    new DateTime('2009-10-01 00:00:00'),
    new DateInterval('P3D'),
    new DateTime('2019-10-01 00:00:00')
);

foreach($period as $date){ 
    $dates[] = $date->format('Y-m-d'); 
};

$today = '2019-08-18 13:00:15';

function custom_sort($array){
  sort($array);
  return $array;
}

function nearest_date_key($array, $today){
    //push today to the array, sort the array, 
    //find the nearest day value of the sorted array and return key
    array_push($array, $today);
    $sorted_dates = custom_sort($array);
    $find_today_key = array_search($today, $sorted_dates);
    $nearest_date = array_slice($sorted_dates, $find_today_key + 1, 1);
    return array_search($nearest_date[0], $array);
}

function find_closest($array, $today)
{
    //$count = 0;
    foreach($array as $day)
    {
        //$interval[$count] = abs(strtotime($date) - strtotime($day));
        $interval[] = abs(strtotime($today) - strtotime($day));
        //$count++;
    }

    asort($interval);
    $closest = key($interval);
    return $closest;
}

$start = microtime(true);
$result_a = nearest_date_key($dates, $today);
$time_elapsed_secs_a = microtime(true) - $start;

$start = microtime(true);
$result_b = find_closest($dates, $today);
$time_elapsed_secs_b = microtime(true) - $start;
?>

打印结果得到(http://phptester.net/

result  time_elapsed
loop approach (a)           1203    0.00630   
sorting index approach (b)  1203    0.00062

这是一个巨大的时间流逝增益。我们除以10等待时间

f0ofjuux

f0ofjuux4#

试试这个:

$date = array(
    [0]=> "2013-02-18 05:14:54"
    [1]=> "2013-02-12 01:44:03"
    [2]=> "2013-02-05 16:25:07"
    [3]=> "2013-01-29 02:00:15"
    [4]=> "2013-01-27 18:33:45");

$baseDate = date_create('2009-10-11');
$count = count($date);
for($loop=0;$count>$loop;$loop++) {
    $datetime = date_create($date[$loop]);
    $interval = date_diff($baseDate, $datetime);
    $newDate[$interval->format('%s')] = $date[$loop];
}
ksort($newDate);
foreach($newDate as $key=>$value) {
    echo $value;
    break;
}

您的第一个元素将是最接近的匹配日期。
注意:请在使用前进行测试。

oknrviil

oknrviil5#

这篇文章帮助我想到了一个解决类似问题的方法,所以我把它放在这里。
给定一个日期数组,我需要找到最近的日期,在上周日之前或等于上周日。
下面是我在不使用任何自定义函数的情况下所做的操作:

$all_dates = [
  '20210328',
  '20210321',
  '20210314',
  '20210307',
];
$last_sunday = date( 'Ymd', strtotime( date( 'Ymd' ) . 'last sunday')); //20210321
$latest_date_index;

foreach( $all_dates as $index => $date ) {
  $date_obj = date_create_from_format( 'Ymd', $date );
  $last_sunday_obj = date_create_from_format( 'Ymd', $last_sunday );

  if ( $date_obj <= $last_sunday_obj ) {
    $latest_date_index = $index;
    break;
  }
}

echo "latest date from array: $all_dates[$latest_date_index]";
echo "array of all past dates from array: " . var_dump(array_slice($all_dates, $latest_date_index));
6tqwzwtp

6tqwzwtp6#

这样你也可以得到排序的日期时间数组

function order_date_time($date_times=array(),$compare=null,$action=1){
    $interval=0;
    $order_date_time=array();
    if(empty($date_times)){
        return array();
    }

    foreach ($date_times as $date_time) {
        $interval = strtotime($compare)-strtotime($date_time);
        $order_date_time[$interval]=$date_time;
    }
    if(empty($compare)){
        krsort($order_date_time);
        return isset($order_date_time) && !empty($order_date_time)?array_values($order_date_time):array();   
    }else{
        $order_date_time=array_values($order_date_time);
        $compare_index=array_search($compare,$order_date_time);
        return $order_date_time[$compare_index+$action]??$order_date_time[$compare_index];
    }
}

//输入

$array=array
    (
        2022-02-23 19:58:00
        2022-03-02 18:00:00
        2022-02-09 18:00:00
    )

$close_dat_time=order_date_time($array,'2022-02-23 19:58:00')

//输出

2022-02-09 18:00:00

相关问题