请教一个最小时间差的算法

我有6个日期,分别是:2018-07-212018-08-132018-08-302018-9-022018-09-282018-11-02

我需要提取出时间间隔最小的两个日期,也就是上面这几个日期我需要提取出:2018-08-302018-9-02

请问怎么做?

阅读 3.4k
5 个回答

趁着排序顺便算一下更省事

var dtStart;
var dtEnd;
var tmDelta = -1;
['2018-07-21','2018-08-13','2018-08-30','2018-9-02','2018-09-28','2018-11-02'].sort(function($a, $b){
    var tmA = (new Date($a)).getTime();
    var tmB = (new Date($b)).getTime();

    var delta = Math.abs(tmA - tmB);
    if(tmDelta == -1 || delta > tmDelta)
    {
        tmDelta = delta;
        dtStart = $a;
        dtEnd   = $b;
    }

    return tmA - tmB;
})

console.log(dtStart, dtEnd)

php的话可以使用array_reduce遍历一遍即可

$dates = ['2018-07-21','2018-08-13','2018-08-30','2018-9-02','2018-09-28','2018-11-02'];
$minSeconds = null;

$result = [];
array_reduce($dates, function($date1, $date2) use(&$minSeconds, &$result) {
    if (empty($date1)) {
        return $date2;
    }
    $date1Seconds = strtotime($date1);
    $date2Seconds = strtotime($date2);
    $seconds = $date2Seconds - $date1Seconds;
    
    if ($minSeconds === null || $seconds < $minSeconds) {
        $minSeconds = $seconds;
        $result = [$date1, $date2];
    }
    return $date2;
}, null);
print_r($result);

是已经排序好的吗?那就直接比相邻的2个日期,从头比到尾找出时间差最小就行了。

const arr=['2018-07-21','2018-08-13','2018-08-30','2018-9-02','2018-09-28','2018-11-02'];
    function toDate(str){
        const arr=str.split(/\D+/);
        arr[1]-=1;
        arr.unshift(Date);
        const d=+new (Date.bind.apply(Date,arr))();
        return d;
    }
    const timeArr=arr.map(toDate);
    let min,index;
    for(let i=0;i<timeArr.length-2;i++){
        const dur=timeArr[i+1]-timeArr[i];
        if(min === undefined){
            min=dur;
            index=i;
        }else if(min>dur){
           min=dur;
           index=i;
        }
    }
    console.log(arr[index],arr[index+1]);

假设你的日期是已经按先后顺序排序了的 如果没有先sort下

我来一个PHP的吧

$arr=['2018-07-21','2018-08-13','2018-08-30','2018-9-02','2018-09-28','2018-11-02'];
$data = [];
for ($i = count($arr)-1 ; $i >= 0; $i--) { 
    for ($j = 0; $j < $i ; $j++) { 
        $a = $arr[$i];
        $b = $arr[$j];
        $v = date_diff(date_create($a), date_create($b)); // 取两个日期相差的天数
        // 格式化成天 http://php.net/manual/zh/function.date-diff.php
        // 两个日期做键 相差天数做值
        // $data[$a.'-'.$b] = $v->format('%a');
        $data[$v->format('%a')] = $a.'-'.$b;
    }
}
echo "<pre>";
//$res = array_flip($data);  //反转键值
ksort($data); //按键排序
var_dump(array_shift($data)); //取出第一个  结果string(20) "2018-9-02-2018-08-30"
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题