我有一个用户每次完成任务时的唯一日期数组。我想检查数组中的日期是否从今天开始连续(包括今天的日期)。
如果数组包含日期:"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.Date
至LocalDate
,您可以执行以下操作(使用代码 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/