Java日历定义要比较的一周中的日期和时间范围

时间:2018-05-24 08:41:15

标签: java time calendar

我需要在一周内定义不同的时段。 然后,我需要传递一系列Calendar对象,以查看这些Calendar对象与哪个句点对应。

e.g。 间隔1:

    Mon 12:00-15:00
    Tue 14:00-17:00

PERIOD2:

    Wed,Thu 09:00-17:00

期间3:

    Thur 17:00-24:00
    Fri  00:00-24:00

在代码中定义这些句点以传递日历对象以查看它们对应哪一个的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

如果您还没有使用Java 8,请始终支持java.time类(或Joda-TimeThreeTen backport。有关'为什么'。

,请参阅this article

我会使用DayOfWeek和两个LocalTime s

class WeekPeriod
{
    private final DayOfWeek day;
    private final LocalTime start;
    private final LocalTime end;

    //constructor and methods
}

将这些组合成三个Set<WeekPeriod>来代表你的三个例子。

答案 1 :(得分:1)

Java 7和ThreeTen Backport

Michael’s answer很好。我想提供一些细节。由于您在another question中提到您使用的是Java 7,因此我提供了Java 7的代码。

首先,Michael正在使用的日期时间类不是内置于Java 7中,而是已经向后移植。因此,获取他提到的ThreeTen Backport并从org.threeten.bp包中导入日期时间类:

import org.threeten.bp.DateTimeUtils;
import org.threeten.bp.DayOfWeek;
import org.threeten.bp.LocalTime;
import org.threeten.bp.ZoneId;
import org.threeten.bp.ZonedDateTime;

然后将以下方法添加到Michael的WeekPeriod类:

public boolean isInPeriod(ZonedDateTime dateTime) {
    DayOfWeek dowToCheck = dateTime.getDayOfWeek();
    LocalTime timeToCheck = dateTime.toLocalTime();
    return dowToCheck.equals(day)
            && ! timeToCheck.isBefore(start)
            && timeToCheck.isBefore(end);
}

如果您希望参数为LocalDateTimeOffsetDateTime,只需更改它,代码就是相同的。当然,您可以重载该方法以接受所有三种类型。

如果您无法避免获取Calendar个对象,请为它们编写一个或两个重载方法。将您的Calendar转换为ZonedDateTime并调用上述方法。如果您的CalendarGregorianCalendar,可能会更直接:

public boolean isInPeriod(GregorianCalendar cal) {
    return isInPeriod(DateTimeUtils.toZonedDateTime(cal));
}

如果不是:

public boolean isInPeriod(Calendar cal) {
    ZoneId zone = DateTimeUtils.toZoneId(cal.getTimeZone());
    return isInPeriod(DateTimeUtils.toInstant(cal).atZone(zone));
}

以上所有内容都适用于Java 7和Java 6。我在jdk1.7.0_79上测试过。

Java 8及更高版本

对于阅读和使用Java 8或更高版本的任何人:

  • java.time包导入日期时间类(不要使用ThreeTen Backport)。
  • 不使用DateTimeUtils转换,而是使用已在Java 8中CalendarGregorianCalendar内置的方法。对于GregorianCalendar使用cal.toZonedDateTime()。对于其他Calendar子类,请使用cal.getTimeZone().toZoneId(),然后使用cal.toInstant()

链接

相关问题