2013-01-18 57 views
1

好的,所以這個問題困擾着我。 我有下面的代碼,它試圖創建此字符串:Android Java日曆Nexus 7上的WEEK_OF_YEAR問題4.2

OUTPUT:52 2012(12月24日至12月30日)

這是今年的第52周的開始和結束2012年,週一是本週的第一天。

private Date getDateObject() { 
    Calendar cld = Calendar.getInstance(); 
    cld.set(Calendar.YEAR, year); 
    cld.set(Calendar.WEEK_OF_YEAR, week); 
    cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
    return cld.getTime(); 
} 

private Date getEndDateObject() { 
    Calendar cld = Calendar.getInstance(); 

    if (week < 52) { 
     cld.set(Calendar.YEAR, year); 
     cld.set(Calendar.WEEK_OF_YEAR, week + 1); 
    } else { 
     cld.set(Calendar.YEAR, year + 1); 
     cld.set(Calendar.WEEK_OF_YEAR, 1); 
    } 

    cld.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); 
    return cld.getTime(); 
} 

public String getDateRangeString() { 
    String pattern = "d MMM"; 
    SimpleDateFormat formatter = new SimpleDateFormat(pattern); 

    Date startDate = getDateObject(); 
    Date endDate = getEndDateObject(); 

    String startDateFormatted = formatter.format(startDate); 
    String endDateFormatted = formatter.format(endDate); 

    String dateString = "" + this.week + ". " + this.year + " (" + startDateFormatted + " to " + endDateFormatted + ")"; 
    return dateString; 
} 

與YEAR對象上使用= 2012和WEEK = 52時,此功能getDateRangeString給出了以下設備的輸出如下:

  • 歌Nexus S - 4.1
  • 模擬器4.1
  • 模擬器4.2

OUTPUT:52 2012(2 12月4日至12月30日)

這是正確的!

但在的Nexus 7運行4.2.1我得到:

OUTPUT:52 2012(12月24日至1月6日)

WTF!?!?

所有設備都設置爲澳大利亞EST +10,並且現在有正確的時間/日期。 我不認爲這與4.2中失蹤的12月份有什麼關係,無論如何應該在4.2.1中修正。

當我調試它時,日曆表示它具有所有正確的值。 然後出來1月6日?

我的意思是它是一個奇怪的一個因爲12月31日就像第53周或什麼? 我不知道,我只是不明白爲什麼這個設備有什麼不同。

+1

日曆API非常混亂,我建議你使用喬達時間來代替。 – dd619

+0

您的代碼目前有點令人困惑 - 我懷疑那裏存在微妙的隱患。目前尚不清楚爲什麼您不僅僅在開始日期添加6天(仍在「日曆」中,以避免DST問題)。您可以在工作和非工作設備上查看「Calendar.getMinimalDaysInFirstWeek」查看是否有所不同,以解釋不同的輸出。 –

回答

2

好的,首先感謝Jon Skeet建議增加6天來獲得本週結束以避免各種問題。這肯定是要走的路。

因此,爲了將來的參考,避免Java日曆/日期foobared。 但我得到了我的代碼偶然在每個設備/平臺上工作。

這是我修改後的代碼:

private Date getDateObject() { 
    Calendar cld = Calendar.getInstance(); 
    cld.set(Calendar.YEAR, year); 
    cld.set(Calendar.WEEK_OF_YEAR, week); 
    cld.get(Calendar.DAY_OF_WEEK); // WARNING this line is required to make the code work. Might have something to do with an inner function called complete which gets called on get. 
    cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
    return cld.getTime(); 
} 

private Date getEndDateObject() { 
    Date endDateObject = getDateObject(); 
    long timeMilliseconds = endDateObject.getTime(); 
    long sixDaysMilliseconds = 60 * 60 * 24 * 6 * 1000; 
    endDateObject.setTime(timeMilliseconds + sixDaysMilliseconds); 
    return endDateObject; 
} 

要特別注意線路

cld.get(Calendar.DAY_OF_WEEK); 

如果任何人都可以解釋爲什麼一個getter是影響日曆,然後加分給他們的輸出。但即時通訊很抱歉WTF ....我偶然發現這一點的唯一原因是我在Log.i中獲得了代碼,然後代碼在所有設備上工作。然後,當我去清理它,並刪除我所有的調試和評論代碼,它再次停止工作。所以我最終把它歸結爲吸氣劑。如果我評論這一行,返回的日期是錯誤的,什麼更糟糕.....即使日誌記錄顯示他們正在使用不同的年份和週數,每次調用日曆都會返回相同的日期/時間..... so簡而言之,如果可能的話,不要使用Java Date。

但是,這仍然無法解釋爲什麼如果我使用我的舊代碼,4.2.1上的Nexus 7會在最後一週返回不同的日期。有人可能會假設我的4.2模擬器和Nexus 7 4.2.1之間存在差異,但似乎不太可能。

從來沒有少,使用6天加入法似乎是最安全,全線工程。

下一次我會使用喬達時間,但我沒有時間去研究如何使用它。

感謝所有的幫助,這在兩個方面仍然是一個奇怪的謎。

  • 爲什麼getter會更改Calendar函數的輸出?我的猜測是它與它聲稱在內部調用的完整方法有關。但即使在文檔中提到它,我也無法完成我的自我。

  • 爲什麼使用Nexus 7 4.2.1獲得不同的一週比我所有的其他設備/仿真器,當日歷功能被送入完全相同的參數。

奇怪。