![](/img/trans.png)
[英]Java Calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY), will it roll backwards, forwards or unknown?
[英]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 和星期二。 我也測試了周六、周日和周一。
Calendar
到DayOfWeek
另一種方式,只要你得到的是一個真正的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 => 星期六
老實說,最強大的方法是實現這樣的東西:
從Int
到DayOfWeek
:
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")
}
從DayOfWeek
到Int
:
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
列表上的任何算術運算更具可讀性。
更好的解決方案是格魯吉亞日歷,它將以更好的方式工作。
Calendar calendar = new GregorianCalendar();
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
dayOfWeek = 1 然后是星期日 .... dayOfWeek = 7 然后是星期六
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.