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

标签 java arrays date date-comparison

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

如果数组包含日期:"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/

相关文章:

java - 将 LineSeparator 移动到页面底部

java - 是否可以读取.txt文件的文件名并将其写入二叉树?

c - 为什么我会得到如此困惑的输出?

.net - .NET 中是否有一种简单的方法来获取数字的 "st"、 "nd"、 "rd"和 "th"结尾?

java - 如何在Google Api Java客户端(Drive)中执行批量请求

java - 无法通过资源 ID 检索值

javascript - 如何在javascript中比较yy-mm-dd格式的两个日期?

java - 将时间戳转换为字符串而不指定格式

objective-c - 创建一个填充有 HTML 代码的数组

java - 获取字符串接受 string[] 作为参数?