簡體   English   中英

Java Calendar定義一周中的日期和時間范圍以與之進行比較

[英]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.time類(如果尚未使用Java 8,則最好使用 Joda-TimeThreeTen backport )。 請參閱本文的“為什么”。

我將使用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 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()

鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM