【问题标题】:Rounding Up to the next date in an array of dates - Javascript四舍五入到日期数组中的下一个日期 - Javascript
【发布时间】:2023-02-01 21:40:11
【问题描述】:

如果我有一组日期,有没有一种方法可以通过向上舍入直到匹配另一个日期来匹配另一个日期?

例如,假设我有一个 dates 数组:

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

我从应用程序中提取了一个日期:“2022-09-29”,我希望该日期通过四舍五入进行自我更新,直到选择下一个即将到来的日期(“2022-10-10”)。

我不确定我会如何像在数学情况下那样四舍五入。

【问题讨论】:

  • JavaScript 日期(不是字符串)支持递增和比较。

标签: javascript


【解决方案1】:

假设您的日期是有序的,您可以从头开始遍历数组,直到找到比应用程序提供的日期大的第一个日期。在 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]
}

【讨论】:

  • 为了使此解决方案正常工作,日期的顺序需要按升序排列。
【解决方案2】:

您不一定需要“四舍五入”日期。增加日期并将其与数组中的每个条目进行比较直到找到匹配项将花费相对大量的时间和资源。对于这样的问题,我更喜欢一种“淘汰”的方法。简单地排除所有不可能的事情,直到你只剩下一个选项。在这种情况下,由于您特别需要输入日期之后的日期,我们可以首先排除输入日期之前的任何内容。然后我们可以使用这个新的日期列表(我们现在知道它们都在输入日期之后)并获得“最小”的日期。这将有效地为您提供最接近输入日期但仍晚于输入日期的日期。

在您的问题中,您将日期显示为字符串列表。这没什么大不了的,因为这仍然可以很容易地完成,但是字符串必须采用 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 2021-12-16
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多