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

时间:2011-08-22 05:10:30

标签: javascript date

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

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

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

13 个答案:

答案 0 :(得分:117)

使用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));

答案 1 :(得分:60)

类似的东西:

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

上测试

答案 2 :(得分:23)

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

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

答案 3 :(得分:9)

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

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

(仅在chrome中测试过,但在大多数浏览器中都有效)

答案 4 :(得分:8)

function sortDates(a, b)
{
    return a.getTime() - b.getTime();
}

var dates = [];

dates.push(new Date("2011/06/26"))
dates.push(new Date("2011/06/28"))
dates.push(new Date("2011/06/25"))
dates.push(new Date("2011/06/27"))

var sorted = dates.sort(sortDates);
var minDate = sorted[0];
var maxDate = sorted[sorted.length-1];

演示:http://jsfiddle.net/AlienWebguy/CdXTB/

答案 5 :(得分:7)

**使用点差运营商| 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);

答案 6 :(得分:3)

ONELINER

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

得出变量minmax,复杂度 O(nlogn),可编辑示例here。如果您的数组没有日期值(例如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});

答案 7 :(得分:2)

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

答案 8 :(得分: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 demo here 并在this codepen

中将其用作AngularJS的过滤器

答案 9 :(得分:1)

与应用相同,现在带有spread

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

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

答案 10 :(得分:0)

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

这是此页面的接受答案: Finding the max value of an attribute in an array of objects

答案 11 :(得分:0)

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

if ($('.LeftAnchorNav').length > 0) {

            // prepare the variables
            var lastID;
            var anchorMenu = $(".LeftAnchorNavMenu");
            var anchorMenuHeight = anchorMenu.outerHeight() + 100;
            var anchorMenuItems = anchorMenu.find(".leftlink");
            var anchorMenuItemsTarget = anchorMenuItems.map(function () {
                var item = $($(this).attr("href"));
                if (item.length) { return item; }
            });

            // bind everything to the scrolling
            $(window).scroll(function () {

                // get anchornav container scroll position and add  buffer
                var fromTop = $(this).scrollTop() + anchorMenuHeight + 300;

                // get ID of the current scroll item
                var currentItem = anchorMenuItemsTarget.map(function () {
                    if ($(this).offset().top < fromTop)
                        return this;
                });

                // get the ID of the current element
                currentItem = currentItem[currentItem.length - 1];
                var id = currentItem && currentItem.length ? currentItem[0].id : "";

                if (lastID !== id) {

                    lastID = id;
                    // Set/remove active class
                    anchorMenuItems.removeClass("highlightleftnavactive")
                    anchorMenuItems.filter("[href='#" + id + "']").addClass("highlightleftnavactive");
                }
            });
        }

答案 12 :(得分:-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 '';
    }   
}

希望它有所帮助。