gpt4 book ai didi

java - 如何检查日期数组与今天的日期是连续的?

转载 作者:行者123 更新时间:2023-12-01 17:56:29 24 4
gpt4 key购买 nike

我有一个用户每次完成任务时的唯一日期数组。我想检查数组中的日期是否从今天开始连续(包括今天的日期)。

如果数组包含日期:"2017/6/2, 2017/6/3, 2017/6/4, 2017/6/5"然后根据今天的日期为 2017/6/5该函数将返回 4因为从今天开始有 4 个连续的日期。

如果数组包含日期 "2017/6/2, 2017/6/3, 2017/6/4"那么它会返回 0因为数组不包含今天的日期。否则,计数将因非连续日期而中断。

List<Date> dateList = new ArrayList<Date>();
int count = 0;
Date todayDate = new Date();

for (int i=0; i<dateList.size(); i++){
// Check if dates within the array are consecutive from todayDate, if so then increment count by 1.
}

最佳答案

如果您使用的是 Java 8,请考虑使用 new java.time API 。更容易,less bugged and less error-prone than the old APIs .

如果您使用的是 Java <= 7,则可以使用 ThreeTen Backport ,Java 8 新日期/时间类的一个很好的向后移植。对于 Android,有 ThreeTenABP (更多关于如何使用它 here )。

虽然您也可以使用 JodaTime,但它已停止使用并被新的 API 取代,我不建议使用 joda 启动一个新项目吗?即使在 joda's website它说:“请注意,Joda-Time 被认为是一个很大程度上“完成”的项目。没有计划进行重大增强。如果使用 Java SE 8,请迁移到 java.time (JSR-310)。” .

<小时/>

由于您只想比较日期(日/月/年),而不是时间(小时/分钟/秒),因此最好的选择是使用 LocalDate类(class)。对于java 8,这个类位于 java.time包,在 ThreeTen Backport 中,包是 org.threeten.bp 。但类和方法名称是相同的。

代码如下:

public int count(List<LocalDate> dateList, LocalDate today) {
if (!dateList.contains(today)) { // today is not in the list, return 0
return 0;
}

int count = 0;
LocalDate prev = dateList.get(0); // get first date from list
for (int i = 1; i < dateList.size(); i++) {
LocalDate next = dateList.get(i);
if (prev.plusDays(1).equals(next)) {
// difference between dates is one day
count++;
} else {
// difference between dates is not 1
// Do what? return 0? throw exception?
}
prev = next;
}

return count + 1; // didn't count the first element, adding 1
}

测试此方法:

List<LocalDate> dateList = new ArrayList<>();
dateList.add(LocalDate.of(2017, 6, 2));
dateList.add(LocalDate.of(2017, 6, 3));
dateList.add(LocalDate.of(2017, 6, 4));
dateList.add(LocalDate.of(2017, 6, 5));
LocalDate today = LocalDate.now();

System.out.println(count(dateList, today)); // 4

另一个测试(当今天不在列表中时)

List<LocalDate> dateList = new ArrayList<>();
dateList.add(LocalDate.of(2017, 6, 2));
dateList.add(LocalDate.of(2017, 6, 3));
dateList.add(LocalDate.of(2017, 6, 4));
LocalDate today = LocalDate.now();

System.out.println(count(dateList, today)); // 0
<小时/>

注释:

  • 由于没有指定当日期不连续时要做什么(返回 0 或抛出异常),所以我对这部分进行了注释。但将其添加到代码中应该很简单
  • 如果你想转换java.util.DateLocalDate ,您可以执行以下操作(使用代码 of this answer ,如果您有任何疑问,此链接中有完整说明):

    public LocalDate convert(Date date) {
    return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }

    // if your Date has no toInstant method, try this:
    public LocalDate convert(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
    }
  • 我了解到您想要检查连续天(因此,日期之间存在 1 天的差异)。但如果您想检查上一个日期是否早于下一个日期(无论多少天),您可以更改 if (prev.plusDays(1).equals(next))if (prev.isBefore(next))

  • 我不确定情况是否如此,但如果您愿意,您也可以解析 String直接发送至LocalDate (因此您不需要创建大量 Date 对象),使用 DateTimeFormatter :

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/M/d");
    LocalDate d = LocalDate.parse("2017/6/2", formatter); // 2017-06-02

关于java - 如何检查日期数组与今天的日期是连续的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44372209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com