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


106

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

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

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

Answers:


137

代码已通过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
要进行数字转换,并不适用于字符串'2011/06/25',而是适用于新的Date('2011/06/25')。编号(新日期(“ 2011/06/25”))=== 1308949200000。代码已在Chrome,IE,FF中进行了测试
Andrew D.

@RobG-“字符串日期”是什么意思?
Andrew D.

例如dates.push('2011/06/05')。使用字符串可以简单地对数组进行排序,并在需要时返回第一个和最后一个成员值并将其转换为日期。
RobG 2011年

10
@RobG-在上面的问题数组中包含Date对象,而不是“日期字符串”-对Date对象也有响应。在某些情况下,使用“日期字符串”是非常不好的做法。比较下两个日期字符串:“ 2011/06/05”和“ 2011/06/05 00:00:00”。1)作为字符串:(“ 2011/06/05” ===“ 2011/06/05 00:00:00”):结果为false;2)作为日期对象(转换为数字):Number(新日期(“ 2011/06/05”))=== Number(新日期(“ 2011/06/05 00:00:00”)):结果是真的-是正确的结果!
Andrew D.

@AndrewD。如果dateStrings一致,请说YYYY/MM/DD HH:MM:SS涉及很多字符串,您会建议比较字符串还是Number(new Date(dateString))比较字符串?
BlackPanther

83

就像是:

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开发人员上测试


Array.reduce()在IE9之前的IE中不可用。虽然很酷的主意。
jfriend00

1
Array.reduce()可以使用javascript等价函数来实现
Andrew D.

恰恰是,在Eloquent Javascript中阅读了该文章:function foreach(func, array) { for(var i = 0; i != array.length; ++i) { func(array[i]); } } function reduce(combine, base, array) { foreach(function(element) { base = combine(base, element); }, array); return base; }
2013年

1
IE <9可能会死亡,实际上,截至2013
。– wprl

3
reduce解决方案适用于字符串和Dates对象。
贝努瓦

33

_.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
不直接回答OP的问题。OP询问JavaScript是否提供内置方法。因此,尽管_.min和_.max可用于查找最小或最大日期,但不是OP所要查找的。另外,考虑实用程序库也是一个自以为是的话题。
detj

13
我谨对此表示不同意,并认为这是一个有用的答案,@ detj-当前措辞中的OP问题假定存在内置函数或他必须编写自己的函数,但这不是事实。在我看来,指出实用程序库可以替代OP提出的任何一种解决方案都是合理的。但是您的推理是有根据的,您的投票是您自己的。
Mark Amery

16

与apply相同,但点差为

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

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


12

由于日期已转换为UNIX纪元(数字),因此您可以使用Math.max / min查找以下内容:

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

(仅在chrome中测试过,但在大多数浏览器中都可以使用)


8

**使用价差运算符| 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);


1
如果您不赞成,请发表评论。为什么这是一个不好的选择?我喜欢这种语法,对于小型数组,性能损失可以忽略不计。
GijsjanB

1
我被否决了。鲁德雷什的答案是我上面的副本。不知道为什么人们不喜欢这个。它是一行代码,而不是很多行。

3
这将返回数字而不是日期,因此您必须将其转换回日期。但是否则它非常优雅。
托马什Hübelbauer

6

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


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

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 演示, 并在此Codepen中将其用作AngularJS的过滤器


0

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

这是此页面可接受的答案: 在对象数组中查找属性的最大值


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

希望能帮助到你。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.