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。

4

5 回答 5

13

我发现 _.min 在moment实例上是可靠的。以下作品:

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

没关系。

于 2013-08-23T04:16:22.903 回答
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 的方法,但不需要用于 _.min. 的 underscore.js 库,并通过使用 func.apply 来缩短,这应该是最新浏览器常用的 javascript。

于 2013-08-23T04:26:00.490 回答
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>');

}  

dates[0]将以排序格式为您提供您的第一个日期。使用上述内容,您也可以按升序和降序排序。只需要在两个地方改变。

干杯。

于 2013-08-23T04:13:58.337 回答
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
于 2013-08-23T04:17:37.263 回答
2

不涉及 momentjs 的脏 oneliner 可能如下所示:

var minDate = new Date(_.min(dates.map(function (date) { return date.getTime(); })));
于 2015-10-29T10:40:33.563 回答