[英]Java Calendar define day and time range in the week to compare against
我需要在一周中定義不同的時間段。 然后,我需要傳遞一系列Calendar對象,以查看這些Calendar對象對應的時間段。
例如Period1:
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 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的java.time
移植(JSR-310的ThreeTen)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.