最近遇到一个需求,要监控离指定utc时间最近的数据。
首先数据是存在历史性的,如:
2018-7-11 10:32:26
2018-7-11 10:34:30
2018-7-11 10:34:42
那么如何获取离2018-7-11 10:32:33
最近的数据呢?
这里可以考虑使用差值计算,既时间在js中是按当前时间到1970年1月1日午夜的毫秒数进行计算的所以可以采用获取这些时间和指定时间的差值,然后计算绝对值后进行排序。
代码如下:
currentdate = new Date();// 指定目标时间为当前时间
nowdate=currentdate.getTime()+currentdate.getTimezoneOffset()*60000; // 我这里使用utc时间进行计算,请不要使用任何的utc转换计算方式,因为js会自动转为当前时间
排序算法:
// 计算两个时间的差值找到离当前时间最近的时间
var comparedate = function (obj1, obj2) {
var val1 = new Date(obj1.Time); // 2018-7-11 10:50:29
var val2 = new Date(obj2.Time);
var dc1 = Math.abs((parseInt(nowdate - val1)/1000));
var dc2 = Math.abs((parseInt(nowdate - val2)/1000));
if (dc1 < dc2) {
return -1;
} else if (dc1 > dc2) {
return 1;
} else {
return 0;
}
}
使用时:
var arraydate = new Array();
arraydate.sort(comparedate);
这里需要注意的是如何获取utc时间,首先说明不能使用以下方式获取:
var nowdate = new Date();
var nowdate = Date.UTC(currentdate.getUTCFullYear(),currentdate.getUTCMonth(),currentdate.getUTCDate(),currentdate.getUTCHours(),
currentdate.getUTCMinutes(),currentdate.getUTCSeconds());
这种方式获取的时间并不是utc时间,同理如果直接使用
var nowdate = new Date();
nowdate = Date.UTC(currentdate.getFullYear(),currentdate.getMonth(),currentdate.getDate(),currentdate.getHours(),
currentdate.getMinutes(),currentdate.getSeconds());
只能使用获取当前时间和时区进行计算后获取时间结果