查找最早的一系列JavaScript日期

时间:2013-08-23 04:08:07

标签: javascript underscore.js momentjs

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

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 个答案:

答案 0 :(得分:12)

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

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

没关系。

答案 1 :(得分: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]会以分类格式为您提供第一个日期。使用上面的内容,您也可以按升序和降序排序。只需要在两个地方改变。

干杯。

答案 2 :(得分:3)

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

请参阅mdn Function.apply

Math.min(arg1,arg2,...argN)找到N个数字参数中最低的。

由于Function.prototype.apply的工作方式,Math.min.apply有两个参数,a this设置,此处似乎不需要,arg array

日期的数字表示是自1970年以来的ms。强制转换为数字的日期将产生此值。新的日期对象初始化为此最低值,这是相同的 日期是最早的日期,但不是同一个对象。

这类似于@ fardjad的方法,但不需要_.min。的underscore.js库,并且通过使用func.apply缩短了,这应该是最新浏览器的常用javascript。

答案 3 :(得分: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

答案 4 :(得分:2)

一个不涉及momentjs的脏oneliner,看起来像这样:

var minDate = new Date(_.min(dates.map(function (date) { return date.getTime(); })));