2013-03-10 64 views
6

我所尋求的是建立在Java中的星期幾的陣列,從昨天開始,上六天時間,這樣的Java - 獲取當天的名稱的數組本週

String daysWeek[] = { "Yesterday", "Today", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}; 

數組的前兩個元素我想返回爲昨天和今天。

起初,這看起來是一件容易的事,通過使用

currentDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK); 

String daysList[] = {"Sunday", "Monday", "Tuesday", "Wednesday", 
      "Thursday", "Friday", "Saturday"}; 

String daysWeek[] = {"Yesterday", "Today", daysList[currentDay], daysList[currentDay+1], ...}; 

以上daysList[currentDay]的說明,將在0,即如果currentDay = 3它說今天是星期二,那麼這將是daysList[2]回到明天自daysList開始的數組。

但我的問題在於,如果當前日期是7,這意味着今天是星期六然後currentDay+1明天將是數組的第八個元素不存在。

有沒有什麼我可以循環我的號碼,如果今天是星期三或以後,然後一次currentDay + x > 7,請設置currentDay回到1?

這一切都發生在一種稱爲getDaysList(currentDay)的方法中,該方法返回daysWeek[]數組。

+1

WChargin的答案是正確的。我只想知道你爲什麼想這樣做。使用數組通常是不良面向對象設計的標誌。也許你的代碼可能被重構。如果你想解釋你的目標是將數據存儲在數組中,也許我們可以找到一個更好的解決方案(或者理解你的解決方案是最好的) – Martin 2013-03-10 18:17:39

回答

7

這裏使用的函數是%)運算符。

基本上,模運算符所做的是採取餘下的部門,這正是你想要的。 (記住回到第四級時 「9/2」 不是4.5,而是4的餘數1這是餘數部分?)

因此,而不是具有:

days[currentDay + x] 

使用:

days[(currentDay + x) % 7] 

由模運算返回的值快速例如:

0 % 7 = 0 (0/7 = 0 R0) 
1 % 7 = 1 (1/7 = 0 R1) 
6 % 7 = 6 (6/7 = 0 R6) 
7 % 7 = 0 (7/7 = 1 R0) 
8 % 7 = 1 (8/7 = 1 R1) 
15 % 7 = 1 (15/7 = 2 R1) 
+0

非常感謝,我忘記了這個符號。 – ChrisAF 2013-03-10 18:32:29

1

可以使用求餘運算符(%):

6 % 7 == 6 
7 % 7 == 0 
8 % 7 == 1 
1

TL;博士

LocalDate.now(ZoneId.of("Pacific/Auckland")) 
     .plusDays(5) 
     .getDayOfWeek() 
     .getDisplayName(TextStyle.FULL , Locale.US) 

詳細

讓您的心關閉與天的週數組索引的想法。

此外,通常最好使用modern collection object來收集對象而不是單純的數組。

另外,避免麻煩Calendar類。現在由java.time類取代。

首先獲取當前日期。 LocalDate類表示沒有時間和不帶時區的僅限日期的值。

時區對確定日期至關重要。對於任何特定的時刻,日期因地區而異。例如,Paris France午夜後幾分鐘是新的一天,而在Montréal Québec仍然是「昨天」。

continent/region的格式指定一個proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4字母縮寫,如ESTIST,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

我們知道昨天的結果是yesterday所以沒有必要來計算日期。如果您確實需要日期,請致電LocalDate::minusDays

我們可以通過提取一個DayOfWeek枚舉對象來詢問每個LocalDate的當天的名稱。那DayOfWeek知道its own name in any human language,你可以通過一個Locale對象指定。因此,您無需跟蹤一組模板名稱字符串。提示:在OOP中,試着想一下(a)讓對象聰明地照顧自己,或者(b)使用輔助對象的幫助,而不是使用基本數組來自己完成所有的工作。

List<String> dayNames = new ArrayList<>(7) ; // Initialize to seven days of a week. 
dayNames.add("yesterday") ; 
dayNames.add("today") ; 
for(int i = 1 ; i <= 5 ; i ++) { 
    LocalDate ld = today.plusDays(i) ; 
    String dayName = ld.getDayOfWeek().getDisplayName(TextStyle.FULL , Locale.US) ; 
    dayNames.add(dayName) ; // Add each of the five days remaining in a week. 
} 

試試這個code live in IdeOne.com

[昨天,今天,週二,週三,週四,週五,週六]


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