我需要在一周中定义不同的周期。 然后,我需要传递一系列日历对象,以查看这些日历对象对应于哪个时间段。
例如 期间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>
来表示您的三个示例。
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);
}
如果您希望参数是LocalDateTime
或OffsetDateTime
,只需更改它,代码是相同的。当然,您可以重载该方法以接受所有三种类型。
如果无法避免获取Calendar
对象,也为它们编写一两个重载方法。将Calendar
转换为ZonedDateTime
并调用上述方法。如果您的Calendar
是GregorianCalendar
,则更直接一些,可能是:
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 中内置到Calendar
和GregorianCalendar
中的方法进行转换。对于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,并进行了非常详尽的解释。