2017-01-02 23 views
2

這真的讓我瘋狂。下面JodaTime將永遠更改爲2015年,如果使用年限設置爲2016

DateTime dt = new DateTime() 
    .withYear(2014) 
    .withWeekOfWeekyear(52) 
    .withDayOfWeek(1); 
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("d MMM yyyy"); 
String firstDayOfWeek = dateTimeFormatter.print(dt); 
Log.v(FILE_NAME,"display date? " + firstDayOfWeek); 
dt = new DateTime() 
    .withYear(2015) 
    .withWeekOfWeekyear(52) 
    .withDayOfWeek(1); 
String lastDayOfWeek = dateTimeFormatter.print(dt); 
Log.v(FILE_NAME,"display date? " + lastDayOfWeek); 
dt = new DateTime() 
    .withYear(2016) 
    .withWeekOfWeekyear(52) 
    .withDayOfWeek(1); 
lastDayOfWeek = dateTimeFormatter.print(dt); 
Log.v(FILE_NAME,"display date? " + lastDayOfWeek); 

不知怎的,該代碼將一直輸出:

display date? 22 Dec 2014 
display date? 21 Dec 2015 
display date? 21 Dec 2015 

正如你所看到的,最後顯示的日期應顯示2016年,2015年不似乎每次我設置withYear到2016年,它會神奇地改變到2015年。這是一個錯誤還是我做錯了什麼?我已經清理並重建了多次項目,但輸出結果是一樣的。

+0

也許嘗試將字符串分配給一個新的字符串?我看到你正在使用lastDayOfWeek變量兩次......可能是問題所在? – riggaroo

+0

@riggaroo謝謝。已經這樣做,但仍然是相同的 – imin

回答

4

方法withYear(...)不符合您的想法,因爲它使用標準日曆年,而不是ISO-8601-paper中描述的星期幾日期。請比較以下兩個片段。只有第二個是你需要的:

DateTime dt = new DateTime().withYear(2016).withWeekOfWeekyear(52).withDayOfWeek(1); 
System.out.println("joda=" + dt); // joda=2015-12-21T18:26:12.776+01:00 

DateTime dt2 = 
    new DateTime().withWeekyear(2016).withWeekOfWeekyear(52).withDayOfWeek(1); 
System.out.println("joda=" + dt2); // joda=2016-12-26T18:27:59.606+01:00 

另請參閱documentation。日曆年和週一年之間的細微差別僅在年底(如今天)結束或開始時才顯着。

詳細解釋的行爲:

如果選擇new DateTime()今天,2017年一月的第二個,然後在歷年設定到2016年的結果:2016年1月2日。但是這個日期是53周屬於2015年的第55周。這個第53周從2015-12-28開始,所以withWeekOfWeekyear(52)這個表達會回到一個星期到2015-12-21(你觀察到的在第一種情況下)。

+0

老實說,我不真的瞭解你的解釋,但你的答案有用,所以非常感謝。無論如何,那麼任何人都會使用YYAR的原因是什麼? – imin

+0

@imin抱歉不太明白。我再試一次:歷年一直是從一月一號到十二月三十一號。但是ISO-paper中描述了一個以周爲基礎的年份(週年日期)作爲與週週期相關的日曆範圍。它的開始始終在星期一,因此可能會與1月的第一天有所不同,具體取決於第一個日曆周至少有4天會影響第一個日曆周(以及以周爲單位)相對於日曆年的確切位置。 –

+1

@imin'withYear(...)'方法通常是首選方法 - 只要您使用幾個月和幾天進行操作即可。但是,如果你使用星期和星期(星期 - 日期 - 視圖),那麼只有你應該使用'withWeekyear()'。 –

相關問題