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

160

如何从日期数组中找出最小值和最大值?目前,我是这样创建数组的:

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

有没有内置函数可以做到这一点,还是我需要自己编写代码?

14个回答

179

代码已经在IE、Firefox和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));

2
数字转换不适用于字符串“2011/06/25”,而是适用于新的Date('2011/06/25')。Number(new Date('2011/06/25')) === 1308949200000。代码已在Chrome、IE、FF中测试。 - Andrew D.
12
在上面的问题中,数组包含日期对象,而不是“日期字符串”,所以响应也适用于日期对象。在某些情况下,使用“日期字符串”是非常糟糕的做法。比较下面两个日期字符串:“2011/06/05”和“2011/06/05 00:00:00”。1)作为字符串:(“2011/06/05” === “2011/06/05 00:00:00”):结果为false;2)作为日期对象(转换为数字):Number(new Date("2011/06/05")) === Number(new Date("2011/06/05 00:00:00")):结果为true - 这是正确的结果! - Andrew D.
@AndrewD。如果日期字符串是一致的,比如 YYYY/MM/DD HH:MM:SS,并且涉及到大量字符串,您会推荐使用字符串比较还是 Number(new Date(dateString)) 比较? - BlackPanther
谢谢安德鲁。好的,知道了。 :) - BlackPanther
2
Math.max.apply(null, dates)和Math.max(...dates)之间有什么区别? - Harshal
显示剩余3条评论

118

类似于:

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上进行测试


在IE9之前,Array.reduce()在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; }` - blaze
2
IE <9 可以消失了,实际上,截至 2013 年 4 月,它仅占全球浏览器使用量的 9.3%。 - wprl
如果日期为空或空值,min函数将无法运行。 - مسعود
5
reduce方法适用于字符串和日期对象。 - Benoit

70

与 apply 相同,现在使用 扩展语法

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

(可以是有关最佳答案的评论)


18
为了让 TypeScript 具有类型兼容性,需要先将日期映射为数字,可以使用 getTime() 方法:dates.map(d => d.getTime()) - Mike de Klerk

45

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

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


4
并没有直接回答OP的问题。OP询问JavaScript中是否有内置方法可用。尽管可以使用_.min和_.max来查找最小或最大日期,但这不是OP正在寻找的内容。此外,考虑使用实用程序库是主观性很强的话题。 - detj
21
我恭敬地不同意,并认为@detj提供的回答很有用 - 目前问题的措辞假定要么有内置函数,要么必须编写自己的函数,但这并不正确。我认为指出实用库作为替代方案是合理的,而不是采用OP提出的两种解决方案之一。但你的推理是有根据的,你的投票权是你自己的。 - Mark Amery
1
简短、简洁并且非常适用于 TypeScript,同时也支持日期类型。 - Kristjan Liiva

15

由于日期被转换为UNIX时间戳(数字),因此您可以使用Math.max/min函数来查找它们:

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

(仅在chrome中测试过,但应该在大多数浏览器中都能工作)


13

**使用扩展运算符| 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
我被踩了。Rudresh的答案与我之前的重复了。不知道为什么人们不喜欢这个。这只是一行代码,而不是很多行。 - user5292841
4
这将返回一个数字而不是日期,因此您需要将其转换回日期。但除此之外,它非常简洁优雅。 - Tomáš Hübelbauer

13
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);进行清理。

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


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

2

如果您需要从字符串日期数组中获取最大或最小日期,并以字符串类型返回,请尝试以下方法:

const dates = ["2021-02-05", "2021-05-20", "2021-01-02"]
const min = dates.reduce((acc,date)=>{return acc&&new Date(acc)<new Date(date)?acc:date},'')
const max = dates.reduce((acc,date)=>{return acc&&new Date(acc)>new Date(date)?acc:date},'')

1

如果您已经在您的堆栈中使用了date-fns max函数,您也可以使用它:

    import { max } from 'date-fns';
    
    const dates = [
      new Date('2022-01-01'),
      new Date('2023-03-24'),
      new Date('2021-12-31')
    ];
    
    const maxDate = max(...dates);
    
    console.log(maxDate); // Output: Wed Mar 24 2023 00:00:00 GMT-0400 (Eastern Daylight Time)

https://date-fns.org/v2.29.3/docs/max


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接