js如何判断两个时间最接近

我有两个json,一个是实时数据

jsonNow=[
        {'value':'1.77','time':'2020-12-09 14:32:00','name':'A'},
        {'value':'1.77','time':'2020-12-09 14:37:00','name':'B'}
  ]

一个是历史数据,数据比较多,我只截取其中一小部分,格式如下:

jsonHistory = 
[
              {'value':'1.78','time':'2020-12-08 14:31:00','name':'A'},
              {'value':'1.76','time':'2020-12-08 14:35:00','name':'A'},
              {'value':'1.79','time':'2020-12-08 14:36:00','name':'A'},
              {'value':'1.71','time':'2020-12-08 14:31:00','name':'B'},
              {'value':'1.66','time':'2020-12-08 14:35:00','name':'B'},
              {'value':'1.69','time':'2020-12-08 14:36:00','name':'B'}
  ]

现在我想根据jsonNow里的name,找到昨天时间最接近的一条数据,
就像现在,我想找到

[
   {'value':'1.78','time':'2020-12-08 14:31:00','name':'A'},
   {'value':'1.69','time':'2020-12-08 14:36:00','name':'B'}
 ]

我要怎么实现呢?

阅读 3.6k
3 个回答

把时间转成时间戳,做减法,哪两个之间的绝对值最小,那他们必然是最接近的。

const result = [];
jsonNow.forEach(nowDate => {
  const nowTime = new Date(nowDate.time).getTime();
  let min = Number.MAX_SAFE_INTEGER;
  let minIndex = 0;
  jsonHistory.forEach((history, index) => {
    const historyTime = new Date(history.time).getTime();
    if (Math.abs(nowTime - historyTime) < min && nowDate.name === history.name) {
      min = Math.abs(nowTime - historyTime);
      minIndex = index;
    }
  });
  result.push(jsonHistory[minIndex]);
});

console.log(result);

但是有个问题是如果 history 有重复的值只能加一次

其实你这个是比较简单的,是数据的过滤比较,比较的参数实质有2个

  1. 是name相同
  2. 是time差最小

现在有了当前数据,直接可以提取name,然后分别对应比较time差
又因为time差是标准的时间格式数据(可以用new Date('时间格式数据')获得一个date对象),date对象有唯一的UTC值,这个值可以直接比较大小,也可以计算绝对差值,又因为明确了当前时间是比以往时间大的数,则用当前时间的UTC去减以往的UTC,找出差最小的一个即可。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题