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

IT技术 javascript date max min
2021-02-07 09:45:31

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

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

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

6个回答

代码经过 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));
@RobG - 在上面的问题中,数组包含 Date 对象,而不是“日期字符串” - 对 Date 对象也有响应。在某些情况下,使用“日期字符串”是一种非常糟糕的做法。比较接下来的两个日期字符串:“2011/06/05”和“2011/06/05 00:00:00”。1) 作为字符串: ("2011/06/05"==="2011/06/05 00:00:00") :结果为假;2)作为日期对象(转换为数字): Number(new Date("2011/06/05"))===Number(new Date("2011/06/05 00:00:00")) : result是真的——是一个正确的结果!
2021-03-24 09:45:31
数字转换不适用于字符串 '2011/06/25',而是适用于 new Date('2011/06/25')。数字(新日期('2011/06/25'))===1308949200000。代码在 Chrome、IE、FF 中测试
2021-03-25 09:45:31
@安德鲁D。如果 dateStrings 是一致的,比如说YYYY/MM/DD HH:MM:SS涉及很多字符串,你会推荐字符串比较还是Number(new Date(dateString))比较?
2021-03-28 09:45:31
例如dates.push('2011/06/05')使用字符串可以简单地对数组进行排序,并在必要时返回第一个和最后一个成员值并转换为日期。
2021-04-05 09:45:31
@RobG - “字符串日期”是什么意思?
2021-04-06 09:45:31

就像是:

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

确切地说,在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; }
2021-03-30 09:45:31
IE <9 可能会消亡,事实上,截至 2013 年 4 月,它现在仅占全球浏览器使用量的 9.3%。
2021-03-30 09:45:31
Array.reduce()在 IE9 之前的 IE 中不可用。很酷的主意。
2021-04-01 09:45:31
Array.reduce() 可以用javascript等价函数实现
2021-04-04 09:45:31
reduce 解决方案适用于字符串和日期对象。
2021-04-06 09:45:31

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

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

简短、简洁并且适用于 TypeScript 并且它支持 Date 类型。
2021-03-24 09:45:31
我恭敬地不同意,并认为这是一个有用的答案,@detj - OP 的问题目前的措辞假设要么有一个内置函数,要么他必须编写自己的函数,但这不是真的。指出实用程序库作为 OP 提出的解决方案之一的替代方案,对我来说似乎是合理的。但你的推理是站得住脚的,你的投票是你自己的。
2021-04-01 09:45:31
不直接回答 OP 的问题。OP 正在询问 JavaScript 中是否有可用的内置方法。因此,虽然 _.min & _.max 可用于查找最小或最大日期,但不是 OP 正在寻找的。此外,考虑实用程序库是一个固执的话题。
2021-04-02 09:45:31

与 apply 相同,现在使用spread

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

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

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

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

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