我有一个日期和一个号码,想要检查这个日期和这个号码是否出现在其他日期的列表中:
+-20
使用相同的号码进行日期间隔所以例如1, 1.1.2013
和1,3.1.2013
应该重新假冒。
我尝试实现类似的方法:
private List<EventDate> dayIntervall(List<EventDate> eventList) throws Exception {
List<EventDate> resultList = new ArrayList<EventDate>();
for (int i = 0; i < eventList.size(); i++) {
String string = eventList.get(i).getDate();
Date equalDate = new SimpleDateFormat("dd.MM.yyyy", Locale.GERMAN).parse(string);
for (int j = 0; j < eventList.size(); j++) {
String string1 = eventList.get(i).getDate();
Date otherDate = new SimpleDateFormat("dd.MM.yyyy", Locale.GERMAN).parse(string1);
if (check number of i with number of j && check Date) {
//do magic
}
}
}
return resultList;
}
迭代方法的构造并不难。对我来说最难的是日期间隔检查部分。我这样试过:
boolean isWithinRange(Date testDate, Date days) {
return !(testDate.before(days) || testDate.after(days));
}
然而,这不起作用,因为天不需要几天。关于如何解决这个问题的任何建议?
我非常感谢你的回答!
答案 0 :(得分:1)
如果可能的话,你应该避免java.util.Date
。使用ThreeTen的后端(期待已久的JDK8替换日期/时间API),您可以获得两个日期之间的天数,如下所示:
int daysBetween(LocalDate start, LocalDate end) {
return Math.abs(start.periodUntil(end).getDays());
}
这有帮助吗?
答案 1 :(得分:1)
您可以获取两个日期之间的日期数,并与days
参数进行比较。使用Joda-Time API这是一项相对简单的任务:How do I calculate the difference between two dates?。
代码:
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy", Locale.GERMAN);
Date startDate = format.parse("1.1.2013");
Date endDate = format.parse("3.1.2013");
Days d = Days.daysBetween(new DateTime(startDate), new DateTime(endDate));
System.out.println(d.getDays());
给出,
2
这也可以使用Calendar
类:
Calendar cal = Calendar.getInstance();
cal.setTime(startDate);
System.out.println(cal.fieldDifference(endDate, Calendar.DAY_OF_YEAR));
给出,
2
现在可以将此2与您的实际值(20)进行比较。
答案 2 :(得分:1)
你的问题很难理解。但鉴于其标题,也许这会有所帮助......
Joda-Time库提供了三个类来表示一段时间:Interval,Period和Duration。
Interval对象具有位于Universe时间轴上的特定端点。一个方便的contains
方法告诉这些端点中是否有DateTime个对象。包含的起始端点,而最后一个端点是独占的。
请注意,时区对于处理夏令时和其他异常以及处理开始日期非常重要。请记住,虽然java.util.Date似乎有时区但没有,但DateTime确实知道它自己的时区。
一些代码离我头顶(未经测试)......
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Berlin" );
DateTime dateTime = new DateTime( yourDateGoesHere, timeZone );
Interval interval = new Interval( dateTime.minusDays( 20 ), dateTime.plusDays( 20 ) );
boolean didEventOccurDuringInterval = interval.contains( someOtherDateTime );
如果您想要整天,请拨打withTimeAtStartOfDay
方法以获取当天的第一时刻。在这种情况下,您可能需要为结束点添加21天而不是20天。正如我上面所说,终点是独家的。因此,如果你想要整天,你需要在之后的第一个时刻你所关心的时间段。你需要午夜后的那一刻。如果这没有意义,请参阅我对其他问题here和here的回答。
请注意,Joda-Time包含一些“午夜”相关的方法和类。 Joda团队不再推荐这些产品。 “withTimeAtStartOfDay”方法取而代之。
DateTime start = dateTime.minusDays( 20 ).withTimeAtStartOfDay();
DateTime stop = dateTime.plusDays( 21 ).withTimeAtStartOfDay(); // 21, not 20, for whole days.
Interval interval = new Interval( start, stop );