2014-01-10 96 views
1

這讓我瘋狂!如何查找Android上給定星期的日期範圍?

我已經到處搜尋,發現例如這個問題:How to get dates of a week (I know week number)?

但是我不能讓它在我工作的實施(在Android API19在Nexus 7):

public Pair<String,String> getWeekRange(int year, int week_no) { 

    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.YEAR, year); 
    cal.set(Calendar.WEEK_OF_YEAR, week_no); 

    cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
    Date monday = cal.getTime(); 
    cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); 
    Date sunday = cal.getTime(); 

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); 
    return new Pair<String,String>(sdf.format(monday), sdf.format(sunday)); 
} 

任何打電話給getWeekRange(2014, WEEK),它總是給我第2周的日期範圍(恰好是今天的本週數)?

日曆似乎是一個非常令人困惑的類,並且一定有我不明白的東西。但根據文檔,YEAR,WEEK_OF_YEARDAY_OF_WEEK應該足以供我設置。

Some test data: 
01-10 18:28:54.730: V/JSON(24503): Week 1/2014 is date range:2014-01-06 to 2014-01-12 
01-10 18:28:54.730: V/JSON(24503): Week 2/2014 is date range:2014-01-06 to 2014-01-12 
01-10 18:28:54.730: V/JSON(24503): Week 3/2014 is date range:2014-01-06 to 2014-01-12 
01-10 18:28:54.730: V/JSON(24503): Week 4/2014 is date range:2014-01-06 to 2014-01-12 
01-10 18:28:54.740: V/JSON(24503): Week 5/2014 is date range:2014-01-06 to 2014-01-12 
01-10 18:28:54.740: V/JSON(24503): Week 1/2013 is date range:2013-01-07 to 2013-01-13 
01-10 18:28:54.740: V/JSON(24503): Week 2/2013 is date range:2013-01-07 to 2013-01-13 
01-10 18:28:54.740: V/JSON(24503): Week 3/2013 is date range:2013-01-07 to 2013-01-13 
01-10 18:28:54.740: V/JSON(24503): Week 4/2013 is date range:2013-01-07 to 2013-01-13 
01-10 18:28:54.740: V/JSON(24503): Week 5/2013 is date range:2013-01-07 to 2013-01-13 

任何人都可以看到我的錯誤嗎?任何幫助表示讚賞。

**編輯**

似乎代碼在Windows上運行正常,這是一個孤立的Android問題。

+4

您的代碼工作完全沒有太大的變化([鏈接到ideone]( http://ideone.com/OfWIVp))。我所做的只是將函數'static',並將其更改爲打印輸出,而不是返回'Pair '。 – dasblinkenlight

+0

我必須在這裏同意dasblinkenlight。您的代碼看起來不錯,並且在我測試時按預期工作。你確定你是在測試發佈的代碼而不是其他的嗎?你使用哪個Java版本? – jarnbjo

+0

是的java.util.Calendar和Date類令人困惑。避免他們兩個。它們非常糟糕,以至於它們在Java 8中被JSR 310定義的新java.time。*類所取代,並受到[Joda-Time](http://www.joda.org/joda-time/)庫的啓發。在您轉移到Java 8之前,請使用Joda-Time。 –

回答

2

寫這個問題讓我再次閱讀文檔,並且只是直覺我換了排序,因此函數現在看起來是這樣的:

public Pair<String,String> getWeekRange(int year, int week_no) { 

    Calendar cal = Calendar.getInstance(); 

    cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
    cal.set(Calendar.YEAR, year); 
    cal.set(Calendar.WEEK_OF_YEAR, week_no); 
    Date monday = cal.getTime(); 

    cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); 
    cal.set(Calendar.YEAR, year); 
    cal.set(Calendar.WEEK_OF_YEAR, week_no); 
    Date sunday = cal.getTime(); 

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); 
    return new Pair<String,String>(sdf.format(monday), sdf.format(sunday)); 
} 

你瞧,它現在給我正確的日期....它必須是內部實現日曆,我不明白的東西。

仍然不知道冗餘線是否必要,但現在我很高興它的工作原理!

+1

您可以使用cal.add(Calendar.Date,6)獲取星期日。這會爲你節省3行:-)。 – Sashi

2

我認爲這是更好的使用Joda-Time這樣操作:

public Pair<String,String> getWeekRange(int year, int week_no) { 
    DateTime startOfWeek = new DateTime().withYear(year).withWeekOfWeekyear(week_no); 

    DateTime endOfWeek = startOfWeek.plusDays(6); 

    return new Pair<String,String>(startOfWeek.toString(), endOfWeek.toString()); 
} 
+0

看來你是從「今天」算起,而不是星期一。如果有人想從星期一然後在'withYear(year)'旁邊計算,他還應該添加'.withDayOfWeek(1)'。無論如何,喬達+1。 – Pshemo

+0

@Pshemo你是對的,我刪除了我的評論。謝謝。 –

+0

除了@Pshemo關於添加'.withDayOfWeek(1)'的評論'我必須記住,喬達時間不幸只能在週一開始的ISO周工作。對於歐洲來說這很好,但在美國這是一個不行。 Java 8(和我的時間庫)會做得更好。 –

1

做沒有導入Pair類

public void getWeeksRangesDates(int y, int w) { 
    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.DAY_OF_MONTH, Calendar.MONDAY); 
    cal.set(Calendar.YEAR, y); 
    cal.set(Calendar.WEEK_OF_YEAR, w); 
    Date date1 = cal.getTime(); 
    cal.add(Calendar.DATE, 6); 
    Date date2 = cal.getTime(); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); 
    Log.v("date1",sdf.format(date1)); 
    Log.v("date2", sdf.format(date2)); 
} 
相關問題