查找一系列 JavaScript 日期中最早的日期

5

如何找到一组日期中最早的日期。目前我有以下代码,它可以正常工作:

var dates = [date1,date2]; // list of javascript dates 
var start = moment(new Date(9999, 0, 1))
// I wished this was one line in momentjs + underscorejs
_.forEach(dates, (date) => {
      if (moment(date).isBefore(start)) {
            start = moment(date);
      }
});

我希望有一种更简洁的方法(只需一行代码)。我想在Underscore(min函数无法处理日期)/ momentjs中使用更简单的函数。
5个回答

13

我发现在moment实例上使用_.min很可靠。以下是有效的:

    var dates = _.map([date1,date2],function(date){return moment(date)});
    var start = _.min(dates);    

没关系。


记住你也可以直接传递函数: var dates = _.map([date1,date2],moment); var start = _.min(dates); - James Drew

4

var earliest = new Date(Math.min.apply(null, dates))

请参考mdn Function.apply

Math.min(arg1,arg2,...argN) 方法用于查找 N 个数值参数中的最小值。

由于 Function.prototype.apply 的工作原理,Math.min.apply 接受两个参数,一个是 this 设置,该设置在此处似乎不需要,并且另一个是 arg array

日期的数字表示是自 1970 年以来的毫秒数。将日期强制转换为数字将得到此值。新的日期对象以此最低值初始化,该值与最早的日期相同,但不是同一对象。

这与 @fardjad 的方法类似,但不需要使用 underscore.js 库进行 _.min,并且通过使用 func.apply 缩短了代码长度,这应该对大多数现代浏览器都是常见的 JavaScript 语法。


3
以下是解决方案:

这里是解决方案:

var dates = [
    new Date(2010, 4, 10, 10, 07, 16),
    new Date(2010, 4, 8, 9, 16, 09),
    new Date(2010, 3, 30, 0, 15, 49),
    new Date(2010, 3, 8, 10, 08, 35)
];


var date_sort_asc = function (date1, date2) {

if (date1 > date2) return 1;
if (date1 < date2) return -1;
return 0;
};

var date_sort_desc = function (date1, date2) {

if (date1 > date2) return -1;
if (date1 < date2) return 1;
return 0;
};     

dates.sort(date_sort_asc);

document.write('<p>Dates sorted in ascending order (oldest to newest):</p>');
for (var i = 0; i < dates.length; i++) {
document.write(i + ': ' + dates[i] + '<br>');
}     

dates.sort(date_sort_desc);

document.write('<p>Dates sorted in descending order (newest to oldest):</p>');
for (var i = 0; i < dates.length; i++) {
document.write(i + ': ' + dates[i] + '<br>');

}  
< p > dates[0]会给你排好序的第一个日期。使用上述方法,您也可以按升序和降序排序,只需要在两个位置进行修改即可。

干杯。


2
一个不涉及momentjs的简短代码可能是这样的:
var minDate = new Date(_.min(dates.map(function (date) { return date.getTime(); })));

很少有脏数据 :D - Yehia A.Salam

2
您可以通过 getTime() 将日期转换为时间戳并进行比较:
// WARNING: Untested code ahead
function getMinDate(dates) {
    var timestamps = dates.map(function (date) { 
        return date.getTime() 
    });
    return new Date(_.min(timestamps));
}

使用方法如下:

getMinDate(yourDatesArray); // returns min date

我认为应该是 var timestamps = $.map(dates, function (date) { - Stumblor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接