TL;博士
核心代碼的概念:
EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY)
.contains(
LocalDate.now(ZoneId.of("America/Montreal"))
.getDayOfWeek()
)
java.time
現代化的方法是使用java.time類。
DayOfWeek
枚舉爲星期一至星期日提供了七個對象。
LocalDate
類代表沒有時間和不帶時區的僅有日期的值。
時區對確定日期至關重要。對於任何特定的時刻,日期因地區而異。例如,Paris France午夜後幾分鐘是新的一天,而在Montréal Québec仍然是「昨天」。
ZoneId z = ZoneId.of("America/Montreal");
LocalDate today = LocalDate.now(z);
DayOfWeek dow = today.getDayOfWeek();
將週末定義爲一組DayOfWeek
對象。請注意,EnumSet
是一個特別快速和低內存的實現Set
旨在容納Enum
對象,如DayOfWeek
。
Set<DayOfWeek> weekend = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY);
現在我們可以測試今天是星期幾還是週末。
Boolean todayIsWeekend = weekend.contains(dow);
該問題表示,如果這是一個週末,我們希望跳到下週開始。爲此,請使用TemporalAdjuster
,它提供可以操作日期 - 時間對象的類。在java.time中我們有immutable objects。這意味着我們根據現有對象內的值生成新實例,而不是修改原始對象(「變異」)。 TemporalAdjusters
類(注意複數'')提供了TemporalAdjuster
的幾個方便的實現,包括next(DayOfWeek)
。
DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY ;
LocalDate startOfWeek = null ;
if(todayIsWeekend) {
startOfWeek = today.with(TemporalAdjusters.next(firstDayOfWeek));
} else {
startOfWeek = today.with(TemporalAdjusters.previousOrSame(firstDayOfWeek));
}
我們軟編碼一週的長度,以防我們的週末定義發生變化。
LocalDate ld = startOfWeek ;
int countDaysToPrint = (DayOfWeek.values().length - weekend.size());
for(int i = 1 ; i <= countDaysToPrint ; i++) {
System.out.println(ld);
// Set up the next loop.
ld = ld.plusDays(1);
}
參見live code in IdeOne.com。
關於java.time
的java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date
,Calendar
,& SimpleDateFormat
。
Joda-Time項目現在位於maintenance mode,建議遷移到java.time。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310。
從何處獲取java.time類?
的ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval
,YearWeek
,YearQuarter
和more。
感謝您的回覆!如果我運行它,它說星期幾是2(星期天在這裏)。所以我已經把它放在那裏,並且星期一從3開始....是對的嗎? – Cristian 2011-01-09 01:55:23