在一天的间隔范围内测试日期

时间:2014-02-11 07:29:54

标签: java date

我有一个日期和一个号码,想要检查这个日期和这个号码是否出现在其他日期的列表中:

  • +-20使用相同的号码进行日期间隔

所以例如1, 1.1.20131,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));
    }

然而,这不起作用,因为天不需要几天。关于如何解决这个问题的任何建议?

我非常感谢你的回答!

3 个答案:

答案 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的时间跨度

Joda-Time库提供了三个类来表示一段时间:IntervalPeriodDuration

间隔

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天。正如我上面所说,终点是独家的。因此,如果你想要整天,你需要在之后的第一个时刻你所关心的时间段。你需要午夜后的那一刻。如果这没有意义,请参阅我对其他问题herehere的回答。

请注意,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 );