向上舍入到日期数组中的下一个日期- Javascript

wgxvkvu9  于 2023-02-02  发布在  Java
关注(0)|答案(2)|浏览(170)

如果我有一个日期数组,有没有一种方法可以通过四舍五入来匹配另一个日期?
例如,假设我有一个dates数组:

"2022-09-15"
"2022-10-10"
"2022-12-01"

我从申请表上查到一个日期:“2022-09-29”,我希望日期通过四舍五入来更新自己,直到选择下一个即将到来的日期(“2022-10-10”)。
我不确定我会如何围捕像我可以在数学的情况下。

xsuvu9jc

xsuvu9jc1#

假设您的日期是按顺序排列的,您可以从数组的开头开始迭代,直到找到第一个大于应用程序提供的日期的日期。在JavaScript中,您可以执行如下直接比较:

"2022-09-15" > "2022-10-10" // false
"2022-09-15" < "2022-10-10" // true

请注意,这是因为您所显示的年、月和日的顺序。如果您想在有日、月和年的地方进行比较,您需要创建一个Date JavaScript对象并以这种方式进行比较。您可以在此处阅读更多相关信息:Compare two dates with JavaScript
但对于您的用例,一个简单的循环可能如下所示:

for(let i = 0; i < array.length; i++) {
   if(applicationDate < array[i])
      return array[i]
}
2lpgd968

2lpgd9682#

你不一定需要把日期"四舍五入"。增加日期并把它与数组中的每一个条目进行比较,直到你找到匹配,这将花费相对大量的时间和资源。我更喜欢一种"淘汰"的方法来解决这样的问题。简单地排除一切不可能的事情,直到你剩下一个选择。在这种情况下,由于您特别需要输入日期之后的日期,我们可以先排除输入日期之前的任何东西,然后我们可以得到这个新的日期列表(我们现在知道都在输入日期之后),并得到"最小"的一个。这将有效地为您提供最接近输入日期但仍在其之后的日期。
在你的问题中,你把日期表示为一个字符串列表,这并不是一个大问题,因为这仍然可以很容易地完成,但是字符串必须是JavaScript可以识别为日期的格式,否则所有的比较结果都将是falseHere是有效日期格式的列表。
我个人喜欢避免依赖于数组的顺序,因为它很难维护,如果/当它坏了,通常很难发现问题是数组顺序不对(从这里的经验来看)。因此,这里提供的代码示例将完全不依赖于数组的顺序。
第一,让我们讨论一个使用Date对象的解决方案。这是相当直接的。唯一的问题是,您需要确保输入的日期是前面讨论过的有效格式。请记住,输入需要转换为Date对象(如果还没有的话),因为日期字符串和Date对象之间的比较总是返回false。要只获取当前日期之后的日期,我们可以使用Array.prototype.filter(),并且为了获得之后的"最小"日期,我们可以使用Math.min.apply(),如this Stack Overflow answer中所解释的。

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

现在来看看日期字符串,其思想与Date对象基本相同,唯一的区别是我们不能在日期字符串上使用Math.min.apply(),但是我们可以使用Array.prototype.reduce()来比较所有的日期,只是有点复杂。

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

相关问题