数组中的最小/最大日期?

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

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"))

是否有一个内置的函数来做到这一点,还是我自己编写?

211390 次浏览
var max_date = dates.sort(function(d1, d2){
return d2-d1;
})[0];

比如:

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 dev 上测试

由于日期被转换为 UNIX 时代(数字) ,因此可以使用 Math.max/min 查找这些日期:

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

(仅在 chrome 中测试,但应该可以在大多数浏览器中工作)

代码经过 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));

_.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')
])

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

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

这是本页公认的答案: 在对象数组中查找属性的最大值

使用 等一下下划线JQuery迭代日期数组。

示例 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 '';
}
}

希望能有帮助。

使用扩展运算符 | 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.application (null,ArrayOfdate) ;

上面的答案不处理空白/未定义的值来解决这个问题,我使用了下面的代码,并用 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 演示 在 < a href = “ https://codepen.io/samdeesh/pen/jLJZxP”rel = “ nofollow noReferrer”> this codepen 中使用它作为 AngularJS 的过滤器

ONELINER :

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});

与应用程序相同,现在使用 传播:

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

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

如果从 string date of array 中获得带字符串类型的 max 或 min date,可以尝试这样做:

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},'')