我需要在一周内定义不同的时段。 然后,我需要传递一系列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
在代码中定义这些句点以传递日历对象以查看它们对应哪一个的最佳方法是什么?
答案 0 :(得分:1)
如果您还没有使用Java 8,请始终支持java.time
类(或Joda-Time或ThreeTen backport。有关'为什么'。
class WeekPeriod
{
private final DayOfWeek day;
private final LocalTime start;
private final LocalTime end;
//constructor and methods
}
将这些组合成三个Set<WeekPeriod>
来代表你的三个例子。
答案 1 :(得分:1)
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);
}
如果您希望参数为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.time
包导入日期时间类(不要使用ThreeTen Backport)。DateTimeUtils
转换,而是使用已在Java 8中Calendar
和GregorianCalendar
内置的方法。对于GregorianCalendar
使用cal.toZonedDateTime()
。对于其他Calendar
子类,请使用cal.getTimeZone().toZoneId()
,然后使用cal.toInstant()
。java.time
。java.time
。java.time
向Java 6和7的后端(JST-310的ThreeTen)。