2012-08-07 27 views
4

我需要從星期一開始我的日曆。 按照今天的日期(2012年8月7日)而言,第一天以星期一和星期中的最小日期爲1,java爲我提供了33周的年份,而android 32,爲什麼?Android Java日曆替代方案,具有以下功能

所以我需要日曆替代具有以下功能。 我正在使用的代碼:

Calendar cal = Calendar.getInstance(); 
cal.setFirstDayOfWeek(Calendar.MONDAY); 
cal.setMinimalDaysInFirstWeek(1); 

out("For date : "+df.format(cal.getTime())+" Week = "+cal.get(Calendar.WEEK_OF_YEAR)); 

任何幫助?

+0

您是否確實在開發系統和手機上運行完全相同的代碼? 'cal.getFirstDayOfWeek()'在Android上打印:'1'(星期日)或'2'(星期一)是什麼?這可能會受到手機語言環境的影響。 – 2012-08-07 12:27:24

+0

@PhilippReichart:嗨,我已經檢查了它是給2 – viv 2012-08-07 12:45:49

回答

0

TL;博士

LocalDate.of(2012 , Month.AUGUST , 7) 
     .get(IsoFields.WEEK_OF_WEEK_BASED_YEAR) 

地點

不知道直接回答你的問題,但可能會在遊戲進行不同Locale值。在Calendar中,一個星期的定義因語言環境而異。

但是這是模擬。您應該使用代替Calendar類的java.time類。

java.time

Calendar是,現在遺留的麻煩舊日期時間類,由java.time類取代的一部分。對於較早的Android,請參閱下面的最後一個項目符號。

您必須按週數定義您的意思。有不同的方法來定義周和週數。

默認情況下,java.time類使用標準ISO 8601 definition:第#周具有日曆年的第一個星期四,並在星期一開始(如您所要求的那樣)。所以歲月有52或53周。歷年的第一天和最後幾天可能會在之前/之後的一週內出現。

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

LocalDate ld = LocalDate.of(2012 , Month.AUGUST , 7) ; 

詢問標準週數。你可以要求這兩種TemporalField對象:IsoFields.WEEK_BASED_YEAR & IsoFields.WEEK_OF_WEEK_BASED_YEAR

int weekOfWeekBasedYear = ld.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR) ; 
int yearOfWeekBasedYear = ld.get(IsoFields.WEEK_BASED_YEAR) ; 

轉儲使用標準ISO 8601 format of YYYY-Www-D安慰。

String isoOutput = yearOfWeekBasedYear + "-W" + String.format("%02d", weekOfWeekBasedYear) + "-" + dayOfWeekNumber ; 
System.out.println(ld + " is ISO 8601 week: " + isoOutput) ; 

看到這個code run live at IdeOne.com

2012-08-07爲ISO 8601周:2012-W32-2

順便說一句,如果Android是以往任何時候都能夠運行ThreeTen-Extra庫,你會發現它的YearWeek類有用。


關於java.time

java.time框架是建立在Java 8和更高版本。這些類代替了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?