var dates = [
new Date("2022-09-15"),
new Date("2022-10-10"),
new Date("2022-12-01")
];
var inputDate = new Date("2022-09-29");
var datesAfter = dates.filter(x => x > inputDate);
var closestDate = new Date(Math.min.apply(null,datesAfter));
console.log(closestDate);
var dates = [
"2022-09-15",
"2022-10-10",
"2022-12-01"
];
var inputDate = "2022-09-29";
var datesAfter = dates.filter(x => x > inputDate);
var closestDate = dates.reduce((a, b) => a > b ? a : b);
console.log(closestDate);
2条答案
按热度按时间xsuvu9jc1#
假设您的日期是按顺序排列的,您可以从数组的开头开始迭代,直到找到第一个大于应用程序提供的日期的日期。在JavaScript中,您可以执行如下直接比较:
请注意,这是因为您所显示的年、月和日的顺序。如果您想在有日、月和年的地方进行比较,您需要创建一个Date JavaScript对象并以这种方式进行比较。您可以在此处阅读更多相关信息:Compare two dates with JavaScript
但对于您的用例,一个简单的循环可能如下所示:
2lpgd9682#
你不一定需要把日期"四舍五入"。增加日期并把它与数组中的每一个条目进行比较,直到你找到匹配,这将花费相对大量的时间和资源。我更喜欢一种"淘汰"的方法来解决这样的问题。简单地排除一切不可能的事情,直到你剩下一个选择。在这种情况下,由于您特别需要输入日期之后的日期,我们可以先排除输入日期之前的任何东西,然后我们可以得到这个新的日期列表(我们现在知道都在输入日期之后),并得到"最小"的一个。这将有效地为您提供最接近输入日期但仍在其之后的日期。
在你的问题中,你把日期表示为一个字符串列表,这并不是一个大问题,因为这仍然可以很容易地完成,但是字符串必须是JavaScript可以识别为日期的格式,否则所有的比较结果都将是
false
。Here是有效日期格式的列表。我个人喜欢避免依赖于数组的顺序,因为它很难维护,如果/当它坏了,通常很难发现问题是数组顺序不对(从这里的经验来看)。因此,这里提供的代码示例将完全不依赖于数组的顺序。
第一,让我们讨论一个使用
Date
对象的解决方案。这是相当直接的。唯一的问题是,您需要确保输入的日期是前面讨论过的有效格式。请记住,输入需要转换为Date
对象(如果还没有的话),因为日期字符串和Date
对象之间的比较总是返回false
。要只获取当前日期之后的日期,我们可以使用Array.prototype.filter()
,并且为了获得之后的"最小"日期,我们可以使用Math.min.apply()
,如this Stack Overflow answer中所解释的。现在来看看日期字符串,其思想与
Date
对象基本相同,唯一的区别是我们不能在日期字符串上使用Math.min.apply()
,但是我们可以使用Array.prototype.reduce()
来比较所有的日期,只是有点复杂。