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

发布于 2022-09-11 15:06:11 字数 265 浏览 13 评论 0

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

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

请问怎么做?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

梦毁影碎の 2022-09-18 15:06:11

我来一个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"
当梦初醒 2022-09-18 15:06:11
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下

公布 2022-09-18 15:06:11

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

北风几吹夏 2022-09-18 15:06:11

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);
安穩 2022-09-18 15:06:11

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

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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文