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



我需要在一周中定义不同的周期。 然后,我需要传递一系列日历对象,以查看这些日历对象对应于哪个时间段。

例如 期间1:

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

期间2:

Wed,Thu 09:00-17:00

期间3:

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

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

总是喜欢java.time类(或者Joda-Time或ThreeTen,如果你还没有使用Java 8(。有关"原因",请参阅本文。

我会使用一个DayOfWeek和两个LocalTime

class WeekPeriod
{
private final DayOfWeek day;
private final LocalTime start;
private final LocalTime end;
//constructor and methods
}

将它们组合成三个Set<WeekPeriod>来表示您的三个示例。

Java

7 和 ThreeTen Backport

迈克尔的回答很好。我只想提供一些细节。由于您在另一个问题中提到您正在使用Java 7,因此我将提供Java 7的代码。

首先,Michael 使用的日期时间类不是内置在 Java 7 中,而是被向后移植的。因此,获取他提到的 ThreeTen 向后移植并从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 向后移植(。
  • 而不是使用DateTimeUtils使用 Java 8 中内置到CalendarGregorianCalendar中的方法进行转换。对于GregorianCalendar请使用cal.toZonedDateTime().对于其他Calendar子类,使用cal.getTimeZone().toZoneId()然后使用cal.toInstant()

链接

  • Oracle 教程:说明如何使用java.time的日期时间。
  • Java 规范请求 (JSR( 310,其中首次描述了java.time
  • ThreeTen Backport 项目,将java.time向 Java 6 和 7 的反向移植(ThreeTen 用于 JSR-310(。
  • ThreeTenABP,ThreeTen Backport 的安卓版
  • 问:如何在Android项目中使用ThreeTenABP,并进行了非常详尽的解释。

最新更新