簡體   English   中英

使用 java.time.DayOfWeek 設置 Calendar.DAY_OF_WEEK

[英]Set Calendar.DAY_OF_WEEK using java.time.DayOfWeek

目前我有一些代碼可以在基於 java8 java.time.DayOfWeek 對象的日歷上設置 DAY_OF_WEEK。 由於這些類型的整數值未對齊,即

日歷.SUNDAY == 1

然而

DayOfWeek.SUNDAY == 7

我想知道是否有推薦的方法從一種轉換到另一種。 目前我正在這樣做。

calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek.getValue() == 7 ? 1 : dayOfWeek.getValue() + 1);

我還需要從日歷日轉換為 DayOfWeek 並返回:

fun dayOfWeekToCalendarDay(day: DayOfWeek): Int {
    return (day.value % 7) + 1
}

fun calendarDayToDayOfWeek(calendarDay: Int): DayOfWeek {
    val temp = (calendarDay + 6) % 7
    return if (temp == 0) DayOfWeek.SUNDAY else DayOfWeek.of(temp)
}

首先,如果可以的話,您當然應該避免設計不良且長期過時的帶有子類的Calendar類。 由於我們現在擁有大量的遺留代碼,這並不總是可行的。

我認為沒有關於如何轉換的官方建議,而且我很確定口味會有所不同。 我自己的首要任務之一是如果我可以避免自己做數學,因為它不可避免地會有點難以閱讀。 user745733 的評論啟發了我:我可以。 內置的WeekFields.SUNDAY_START對象以與Calendar相同的方式對星期幾進行編號,從星期日 = 1 到星期六 = 7。讓我們使用它。

    DayOfWeek dayOfWeek = DayOfWeek.TUESDAY;
    Calendar calendar = Calendar.getInstance();

    calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek.get(WeekFields.SUNDAY_START.dayOfWeek()));
    System.out.println("" + calendar.get(Calendar.DAY_OF_WEEK) + " " + calendar.getTime());

我剛才運行時的輸出:

2019 年 6 月 4 日星期二 18:25:33 CEST

正如預期的那樣,我得到了 3 和星期二。 我也測試了周六、周日和周一。

CalendarDayOfWeek

另一種方式,只要你得到的是一個真正的GregorianCalendar ,它並沒有那么糟糕(雖然有些語言環境會給你一個不同的Calendar子類)。

    Calendar calendar = Calendar.getInstance();
    DayOfWeek dow = ((GregorianCalendar) calendar).toZonedDateTime().getDayOfWeek();
    System.out.println("" + calendar.getTime() + " => " + dow);

2019 年 6 月 8 日星期六 18:32:38 CEST => 星期六

老實說,最強大的方法是實現這樣的東西:

IntDayOfWeek

fun calendarToDayOFWeek(dayOfWeek: Int) = when(dayOfWeek) {
    Calendar.MONDAY -> DayOfWeek.MONDAY
    Calendar.TUESDAY -> DayOfWeek.TUESDAY
    Calendar.WEDNESDAY -> DayOfWeek.WEDNESDAY
    Calendar.THURSDAY -> DayOfWeek.THURSDAY
    Calendar.FRIDAY -> DayOfWeek.FRIDAY
    Calendar.SATURDAY -> DayOfWeek.SATURDAY
    Calendar.SUNDAY -> DayOfWeek.SUNDAY
    else -> throw IllegalArgumentException("Incorrect day specified")
}

DayOfWeekInt

fun dayOfWeekToCalendar(dayOfWeek: DayOfWeek) = when(dayOfWeek) {
    DayOfWeek.MONDAY -> Calendar.MONDAY
    DayOfWeek.TUESDAY -> Calendar.TUESDAY
    DayOfWeek.WEDNESDAY -> Calendar.WEDNESDAY
    DayOfWeek.THURSDAY -> Calendar.THURSDAY
    DayOfWeek.FRIDAY -> Calendar.FRIDAY
    DayOfWeek.SATURDAY -> Calendar.SATURDAY
    DayOfWeek.SUNDAY -> Calendar.SUNDAY
}

這可能看起來像很多代碼,但該方法比枚舉values列表上的任何算術運算更具可讀性。

DayOfWeek是一個枚舉,代表一周中的 7 天 - 周一、周二、周三、周四、周五、周六和周日,遵循 ISO-8601 標准,從 1(周一)到 7(周日)。 更多信息請點擊這里

但是在日歷課程中,它以不同的方式給出,即從星期日(1)到星期六(7)。 看這里

我想你遵循的方法很好。

更好的解決方案是格魯吉亞日歷,它將以更好的方式工作。

Calendar calendar = new GregorianCalendar();
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);

dayOfWeek = 1 然后是星期日 .... dayOfWeek = 7 然后是星期六

暫無
暫無

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

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