大家好,我有一个问题,如:
问题:我有一系列日期,但有些日期不见了。 ['10-Mar-2017','11-Mar-2017','12-Mar-2017','14-Mar-2017','14-Mar-2017','15-Mar-2017','16-Mar-2017','17-Mar-2017','19-Mar-2017','23-Mar-2017','25-Mar-2017','26-Mar-2017','27-Mar-2017']
。
现在我想强调我前端的日期工作顺利,但只有当我的范围在阵列中可用时它才有效。例如,我选择突出显示13-Mar-2017
这不起作用。
所以我想如果我采用最接近的日期,如果13
不可用,则应突出显示14-Mar-2017
。这是我试过的。
尝试过的解决方案:
min_date = getFormattedDate(dates.min);
max_date = getFormattedDate(dates.max);
temp_date=new Date(min_date);
for (index=0; index < graphData.graph_data.length; index++){
date = new Date(getFormattedDate(graphData.graph_data[index].date));
if (temp_date == date) {
min_date=getFormattedDate(temp_date);
} else {
temp_date = (new Date(temp_date).addDays(1));
}
}
getFormattedDate
是我的函数,它在生成所需的输出格式日期后将字符串传递给我。
任何解决方案?
答案 0 :(得分:0)
你可以使用getTime()来获得一个代表自1970/01/01以来的毫秒数的数字,并比较两个日期之间的距离。像这样:
var dates = ['10-Mar-2017','11-Mar-2017','12-Mar-2017','14-Mar-2017','14-Mar-2017','15-Mar-2017','16-Mar-2017','17-Mar-2017','19-Mar-2017','23-Mar-2017','25-Mar-2017','26-Mar-2017','27-Mar-2017'];
function getClosestDate(myDate, dates){
var distances = [];
var option = new Date(myDate);
for(let i = 0; i < dates.length; i++)
{
distances[i] = { index: i,
distance: Math.abs(new Date(dates[i]).getTime() - option.getTime()),
value: new Date(dates[i]).getTime()
};
}
distances.sort((a,b) => a.distance - b.distance);
var smallestDistance = distances[0].distance;
//now get the greater date in same distances
distances = distances.filter((v) => v.distance == smallestDistance);
distances.sort((a,b) => b.value - a.value);
return dates[distances[0].index];
}
console.log(getClosestDate('13-Mar-2017', dates));
&#13;
答案 1 :(得分:0)
由于 temp_date 和 date 是Date对象:
temp_date == date
将始终评估为false。
你遗漏了很多关于你如何解析,格式化和递增日期的信息,所以我已经包含了那些简单的版本。
您可以在解析后将字符串作为日期进行比较,但不应该依赖内置的解析器。对于缺少日期,您似乎想要进入下一个最高日期,因此以下操作。如果你想要最近的日期,你需要更多的逻辑去下一个最高和下一个最低,然后选择你想要的那个。
以下搜索匹配日期,如果找到,则返回该日期。否则,它会查找下一个最高日期。如果超出范围,则返回消息。您可能还想包含下限。
这不是一个完整的解决方案,只是一个如何解决它的例子。
// Setup functions to parse, format and increment Dates
Date.prototype.addDays = function(days) {
this.setDate(this.getDate() + days);
return this;
}
Date.prototype.formatDate = function(){
var months = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' ');
return ('0'+this.getDate()).slice(-2) + '-' + months[this.getMonth()] + '-' + this.getFullYear();
}
Date.parseF = function(s) {
var months = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' ');
var b = s.split('-');
return new Date(b[2], months.indexOf(b[1]), b[0]);
}
// Data
var dates = ['12-Mar-2017','14-Mar-2017'];
// Get matching date or next highest
function getNearest(s, data) {
// Set limits for search
var min = Date.parseF(s);
var max = Date.parseF(data[data.length - 1]);
do {
// Search for match
var idx = data.indexOf(s);
// If found, return s
if (idx >= 0) return s;
// Otherwise, increment date and search again
min.addDays(1);
s = min.formatDate();
} while (min <= max)
return 'Outside range';
}
// Tests
['12-Mar-2017','13-Mar-2017','14-Mar-2017','15-Mar-2017'].forEach(function(s) {
console.log(s + ': ' + getNearest(s, dates));
});