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

Leg*_*end 95 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"))
Run Code Online (Sandbox Code Playgroud)

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

And*_* D. 128

代码使用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));
Run Code Online (Sandbox Code Playgroud)

  • @RobG - 在上面的问题数组中包含Date对象,而不是"date strings" - 对Date对象也有响应.在某些情况下,使用"日期字符串"是一个非常糟糕的实践.比较接下来的两个日期字符串:"2011/06/05"和"2011/06/05 00:00:00".1)as strings:("2011/06/05"==="2011/06/05 00:00:00"):结果为假; 2)作为日期对象(转换为数字):数字(新日期("2011/06/05"))===数字(新日期("2011/06/05 00:00:00")):结果是真的 - 是正确的结果! (10认同)
  • 数字转换不适用于字符串 '2011/06/25',而是适用于 new Date('2011/06/25')。数字(新日期('2011/06/25'))===1308949200000。代码在 Chrome、IE、FF 中测试 (2认同)
  • Math.max.apply(null,dates) 和 Math.max(...dates) 之间有什么区别? (2认同)

小智 72

就像是:

var min = dates.reduce(function (a, b) { return a < b ? a : b; }); 
var max = dates.reduce(function (a, b) { return a > b ? a : b; });
Run Code Online (Sandbox Code Playgroud)

在Chrome 15.0.854.0 dev上测试过

  • reduce解决方案适用于字符串和Dates对象。 (3认同)
  • IE &lt;9 可能会消亡,事实上,截至 2013 年 4 月,它目前仅占全球浏览器使用量的 9.3%。 (2认同)

小智 32

与 apply 相同,现在使用spread

const maxDate = new Date(Math.max(...dates));
Run Code Online (Sandbox Code Playgroud)

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

  • 对于 TypeScript,为了具有类型兼容性,应首先将日期映射到数字,可以使用“getTime()”来实现此目的。`dates.map(d =&gt; d.getTime())`。 (18认同)

Mar*_*ery 28

_.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')
])
Run Code Online (Sandbox Code Playgroud)

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

  • 我恭敬地不同意并认为这是一个有用的答案,@ detj - OP的问题,因为目前措辞假定有内置函数或者他必须自己写,但事实并非如此.我指出实用程序库是OP提出的解决方案的替代方案似乎是合理的.但你的推理是可辩护的,你的投票是你自己的. (9认同)
  • 不直接回答OP的问题。OP询问JavaScript是否提供内置方法。因此,尽管_.min和_.max可用于查找最小或最大日期,但不是OP所要查找的。同样,考虑实用程序库也是一个自以为是的话题。 (3认同)

Ric*_*asi 11

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

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

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


Ali*_*guy 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];
Run Code Online (Sandbox Code Playgroud)

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

  • 请用更简单,更有效的解决方案来启发我们. (14认同)
  • 我不认为你应该排序一个数组只是为了找到它的最小值.可以有比这更简单,更有效的解决方案. (6认同)
  • 是的,线性解决方案优于Array.sort的线性复杂度. (2认同)

Rud*_*kar 8

**使用Spread Operators | 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);
Run Code Online (Sandbox Code Playgroud)

这将给出数组的最小日期.

它的简写为Math.min.apply(null,ArrayOfdates);

  • 这将返回一个数字而不是日期,因此您必须将其转换回日期。但除此之外,它非常优雅。 (3认同)

Kam*_*ski 8

单线

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

导致变量minmax,复杂度O(nlogn),可编辑示例here。如果您的数组具有无日期值(如null),请先将其清理干净dates=dates.filter(d=> d instanceof Date);

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


won*_*ng2 4

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