查找特定日期所属的确切或最近的日期组

时间:2019-01-30 18:57:19

标签: javascript

所以我的json数据如下:

 */1 * * * * python3 /pathtofile/manage.py update_data

像这样,每周间隔7天。给定一个特定的日期,我想根据下降的日期获取其ID。例如。 2018年1月1日至2018年1月7日将是id等。

但是有时可能不存在一个星期,例如2月的所有星期都丢失了。因此,在这种情况下,如果我想输入id为2018-02-25,则应该获取下一个最接近的组,即id为y。

当前,我得到的日期属于一个确切的组,但如果缺少或找不到,则不会,如下所示。理想情况下,我只希望将json数据循环一次,但可以使用有效的解决方案。

 [ {"begin": "2018-01-01", "end": "2018-01-07", "id":"a"}, {"begin":"2018-01-08", "end":"2018-01-15", "id":"b"}, {"begin":"2018-03-01", "end":"2018-03-07", "id":"y"}]

对于在json数据中具有组表示形式的日期,它可按预期工作,而对于其他日期则不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

在扫描数组时,请记住哪一组最接近到目前为止所有目标日期。这样,如果您用尽搜索但没有找到匹配项,您将知道哪个是最接近的。

答案 1 :(得分:0)

const parsed_data = [ {"begin": "2018-01-01", "end": "2018-01-07", "id":"a"}, {"begin":"2018-01-08", "end":"2018-01-15", "id":"b"}, {"begin":"2018-03-01", "end":"2018-03-07", "id":"y"}]

let client_date = new Date(2018, 1, 2);

let data = parsed_data.filter(value => {

    const end_date_parts  = value['end'].split('-');

    const end_date = new Date(end_date_parts[0], end_date_parts[1]-1, end_date_parts[2]);

    // compare now client_date

    if (client_date <= end_date){
        return value;
    }
});

console.log(data);

答案 2 :(得分:0)

您应该计算传递的日期时间与.getTime()相加之间的差,以获取时间戳记值。

let parsed_data =  [
  {"begin": "2018-01-01", "end": "2018-01-07", "id":"a"}, 
  {"begin":"2018-01-08", "end":"2018-01-15", "id":"b"}, 
  {"begin":"2018-03-01", "end":"2018-03-07", "id":"y"}
];

const date = new Date(); //get todays date but care about month and day only
let client_date = new Date(2018, date.getMonth()  , date.getDate()).getTime();

// Set default
let i = parsed_data[0];

// Set diff to timediff in 10 years
let diff = 60*60*24*365*10000;

// Loop the data
parsed_data.forEach(function(value, index) {
    let start_date_parts = value['begin'].split('-');
    let end_date_parts  = value['end'].split('-');

    let start_date = new Date(start_date_parts[0], start_date_parts[1]-1, start_date_parts[2]).getTime();
    let end_date = new Date(end_date_parts[0], end_date_parts[1]-1, end_date_parts[2]).getTime();
      
    if (Math.abs(start_date - client_date) < diff) {
      diff = Math.abs(start_date - client_date); // set new diff value
      i = parsed_data[index];
    }
  
    if (Math.abs(end_date - client_date) < diff) {
      diff = Math.abs(start_date - client_date); // set new diff value
      i = parsed_data[index];
    }
});

console.log(i); // the closest datetime
console.log('The id: ' + i['id']) // the id you need