2017-08-04 40 views
0

我想使用Calendar API獲取ISO日的一週,但它會返回錯誤的日期編號。如何使用日曆API獲取ISO日期

週日是一週的最後一天,應該是數從ISO標準,與週一是第一天爲1號。

但運行下面的代碼爲週日(2017-07 -30)正在重新調整我的號碼。 Calendar爲什麼API返回一個不同的值?

Calendar cal = Calendar.getInstance(Locale.US); 
cal.set(Calendar.YEAR, 2017); 
cal.set(Calendar.MONTH, Calendar.JULY); 
cal.set(Calendar.DAY_OF_MONTH, 30); 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0); 
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); 

System.out.println(dayOfWeek); 

的結果是:1

我嘗試使用約達時間,它工作得很好,但我需要使用日曆和Java 6做到這一點,因此使用其他庫是不是一個解決方案。

回答

1

int常量以星期日開始,星期六結束。

記錄在java.util.Calendar JavaDoc for Java 6

所以我的建議是自己計算一下。

+0

當然,你是對的。沒有枚舉,常量。我已經根據這個改變了答案。 – Maia

0

檢查日曆的Java 6的發佈提問values of Constants in Calendar

Calendar.SUNDAY的值是1的美國地區之前的Javadoc。

+0

Calendar.SUNDAY的值始終相同,它不會因區域設置而更改。 –

+0

Calendar.sunday不會由語言環境更改,而會根據語言環境更改爲1。我對於模糊的答案表示歉意,但我的意圖不同 –

1

TL;博士

傳統的方法來確定某一天的週數定義ISO 8601(週一至週日,1-7):

int dayOfWeekISO = cal.get(Calendar.DAY_OF_WEEK) - 1 ; 
if(dayOfWeekISO == 0) { // For Sunday (1 - 1 = 0), add 7. 
    dayOfWeekISO = (dayOfWeekISO + 1) ; 
} 

現代方式:

LocalDate.of(2017 , Month.JULY , 30) // Date-only value. 
     .getDayOfWeek()    // `DayOfWeek.SUNDAY` enum object. 
     .getValue()     // 7 for Sunday. (1 = Monday, per ISO 8601 standard.) 

詳細信息

accepted answer by Maia是正確的:Those int constants on Calendar定義一週爲1-7爲Sunday-星期六,根據美國的習俗。

DAY_OF_WEEK

公共靜態最終詮釋DAY_OF_WEEK

場數get和set表示星期幾。該字段的值爲星期日,星期一,星期二,星期三,星期四,星期五和星期六。

如果你絕對不能添加一個圖書館,那麼你必須從一個星期是星期日至星期六1-7的Calendar定義調整。把錢放在第一位,減去1,然後檢查你添加的0。

int dayOfWeekISO = cal.get(Calendar.DAY_OF_WEEK) - 1 ; 
if(dayOfWeekISO == 0) { // For Sunday (1 - 1 = 0), add 7. 
    dayOfWeekISO = (dayOfWeekISO + 1) ; 
} 

通過走另一條路,從ISO 8601風格,美國風格(星期日第一)的方式,計算modulo 7,然後加1

(DayOfWeek.SUNDAY.getValue() % 7) + 1 

像這樣:

System.out.println((DayOfWeek.SUNDAY.getValue() % 7) + 1) ; 
System.out.println((DayOfWeek.MONDAY.getValue() % 7) + 1) ; 
System.out.println((DayOfWeek.TUESDAY.getValue() % 7) + 1) ; 
System.out.println((DayOfWeek.WEDNESDAY.getValue() % 7) + 1) ; 
System.out.println((DayOfWeek.THURSDAY.getValue() % 7) + 1) ; 
System.out.println((DayOfWeek.FRIDAY.getValue() % 7) + 1) ; 
System.out.println((DayOfWeek.SATURDAY.getValue() % 7) + 1) ; 

但不要考慮添加a library of modern date-time classes。值得爲你的項目添加一個jar的麻煩。那些舊的日期時間課程確實很糟糕。

避免遺留日期時類

Calendar類是麻煩的舊的遺留日期時間類,現在java.time類取代的一部分。

java.time

java.time.DayOfWeek枚舉是標準的,表示由ISO 8601其中每週從週一到週日定義的一週,編號爲1-7。

LocalDate類代表沒有時間和沒有時區的僅有日期的值。

LocalDate ld = LocalDate.of(2017 , Month.JULY , 30) ; 
DayOfWeek dow = ld.getDayOfWeek() ; 
int dowNumber = dow.getValue() ; 
String output = dow.getDisplayName(TextStyle.FULL , Locale.CANADA_FRENCH) ; 

請參閱this code run live at IdeOne.com

ld.toString():2017年7月30日

dow.toString():星期日

dowNumber:7

輸出:星期日


關於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,YearQuartermore

相關問題