140

如何从日期数组中找出最小和最大日期?目前,我正在创建一个这样的数组:

var dates = [];
dates.push(new Date("2011/06/25"))
dates.push(new Date("2011/06/26"))
dates.push(new Date("2011/06/27"))
dates.push(new Date("2011/06/28"))

是否有内置函数可以执行此操作,还是我自己编写?

4

12 回答 12

165

代码用 IE,FF,Chrome 测试并正常工作:

var dates=[];
dates.push(new Date("2011/06/25"))
dates.push(new Date("2011/06/26"))
dates.push(new Date("2011/06/27"))
dates.push(new Date("2011/06/28"))
var maxDate=new Date(Math.max.apply(null,dates));
var minDate=new Date(Math.min.apply(null,dates));
于 2011-08-22T05:46:29.300 回答
106

就像是:

var min = dates.reduce(function (a, b) { return a < b ? a : b; }); 
var max = dates.reduce(function (a, b) { return a > b ? a : b; });

在 Chrome 15.0.854.0 开发版上测试

于 2011-08-22T05:18:26.793 回答
42

_.min_.max处理日期数组;如果您使用的是 Lodash 或 Underscore,请使用它们,如果您还没有使用 Lodash(它提供了许多类似的实用功能),请考虑使用它们。

例如,

_.min([
    new Date('2015-05-08T00:07:19Z'),
    new Date('2015-04-08T00:07:19Z'),
    new Date('2015-06-08T00:07:19Z')
])

将返回数组中的第二个日期(因为它是最早的)。

于 2015-04-11T13:28:53.383 回答
38

与 apply 相同,现在使用spread

const maxDate = new Date(Math.max(...dates));

(可能是对最佳答案的评论)

于 2019-06-16T10:55:40.360 回答
15

由于日期被转换为 UNIX 纪元(数字),您可以使用 Math.max/min 来查找:

var maxDate = Math.max.apply(null, dates)
// convert back to date object
maxDate = new Date(maxDate)

(仅在 chrome 中测试,但应该适用于大多数浏览器)

于 2011-08-22T05:23:16.350 回答
13

**使用传播运算符| ES6 **

let datesVar = [ 2017-10-26T03:37:10.876Z,
  2017-10-27T03:37:10.876Z,
  2017-10-23T03:37:10.876Z,
  2015-10-23T03:37:10.876Z ]

Math.min(...datesVar);

这将给出数组中的最小日期。

它的简写 Math.min.apply(null, ArrayOfdates);

于 2017-10-26T12:33:23.217 回答
9

单线

var min= dates.sort((a,b)=>a-b)[0], max= dates.slice(-1)[0];

产生变量minmax,复杂度O(nlogn) ,此处可编辑示例。如果您的数组有无日期值(如null),请先将其清理为dates=dates.filter(d=> d instanceof Date);.

var dates = [];
dates.push(new Date("2011-06-25")); // I change "/" to "-" in "2011/06/25"
dates.push(new Date("2011-06-26")); // because conosle log write dates 
dates.push(new Date("2011-06-27")); // using "-".
dates.push(new Date("2011-06-28"));

var min= dates.sort((a,b)=>a-b)[0], max= dates.slice(-1)[0];

console.log({min,max});

于 2018-12-06T14:34:55.690 回答
3
var max_date = dates.sort(function(d1, d2){
    return d2-d1;
})[0];
于 2011-08-22T05:18:11.310 回答
1

上面的答案不处理空白/未定义的值来解决这个问题我使用了下面的代码并用 NA 替换了空白:

function getMax(dateArray, filler) {
      filler= filler?filler:"";
      if (!dateArray.length) {
        return filler;
      }
      var max = "";
      dateArray.forEach(function(date) {
        if (date) {
          var d = new Date(date);
          if (max && d.valueOf()>max.valueOf()) {
            max = d;
          } else if (!max) {
            max = d;
          }
        }
      });
      return max;
    };
console.log(getMax([],"NA"));
console.log(getMax(datesArray,"NA"));
console.log(getMax(datesArray));

function getMin(dateArray, filler) {
 filler = filler ? filler : "";
  if (!dateArray.length) {
    return filler;
  }
  var min = "";
  dateArray.forEach(function(date) {
    if (date) {
      var d = new Date(date);
      if (min && d.valueOf() < min.valueOf()) {
        min = d;
      } else if (!min) {
        min = d;
      }
    }
  });
  return min;
}

console.log(getMin([], "NA"));
console.log(getMin(datesArray, "NA"));
console.log(getMin(datesArray));

我在这里添加了一个普通的 javascript 演示,并在这个 codepen 中将 它用作 AngularJS 的过滤器

于 2017-12-28T09:52:15.063 回答
1

如果您从数组的字符串日期获得字符串类型的最大或最小日期,您可以试试这个:

const dates = ["2021-02-05", "2021-05-20", "2021-01-02"]
const min = dates.reduce((acc,date)=>{return acc&&new Date(acc)<new Date(date)?acc:date},'')
const max = dates.reduce((acc,date)=>{return acc&&new Date(acc)>new Date(date)?acc:date},'')
于 2021-07-27T12:06:58.867 回答
0

这是一种特别好的方法(您可以使用对象属性之一获取对象数组的最大值):Math.max.apply(Math,array.map(function(o){return o.y;}))

这是此页面的公认答案: Finding the max value of an attribute in a array of objects

于 2017-05-23T10:38:40.087 回答
-2

使用MomentUnderscorejQuery来迭代日期数组。

示例 JSON:

"workerList": [{        
        "shift_start_dttm": "13/06/2017 20:21",
        "shift_end_dttm": "13/06/2017 23:59"
    }, {
        "shift_start_dttm": "03/04/2018 00:00",
        "shift_end_dttm": "03/05/2018 00:00"        
    }]

Javascript:

function getMinStartDttm(workerList) {  
    if(!_.isEmpty(workerList)) {
        var startDtArr = [];
        $.each(d.workerList, function(index,value) {                
            startDtArr.push(moment(value.shift_start_dttm.trim(), 'DD/MM/YYYY HH:mm')); 
         });            
         var startDt = _.min(startDtArr);           
         return start.format('DD/MM/YYYY HH:mm');
    } else {
        return '';
    }   
}

希望能帮助到你。

于 2017-06-13T15:33:56.970 回答