如果没有在javascript中找到,请选择最近的日期

时间:2017-12-15 17:19:24

标签: javascript date

大家好,我有一个问题,如:

问题:我有一系列日期,但有些日期不见了。 ['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是我的函数,它在生成所需的输出格式日期后将字符串传递给我。

任何解决方案?

2 个答案:

答案 0 :(得分:0)

你可以使用getTime()来获得一个代表自1970/01/01以来的毫秒数的数字,并比较两个日期之间的距离。像这样:

&#13;
&#13;
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;
&#13;
&#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));
});