2014-06-19 57 views
-5

我試圖編寫一個代碼,顯示最近10個日期的星期幾。處理最後10個工作(業務)天java

下面的代碼的一部分:

Calendar cal = Calendar.getInstance();  
for(int i=0; i<=9;i++) { 
    cal.add(Calendar.DATE, -i); 
    Date tday=cal.getTime(); 
    SimpleDateFormat dy = new SimpleDateFormat("EEE"); 
    String d9 = dy.format(tday); 
    System.out.println(d9); 
} 

而不是顯示它顯示的是這樣一個順序所有在過去10天中:

週四 週三 週一 週五 週一 星期三 Thu Thu Wed Mon Fri

我在哪裏犯了錯誤?

+1

?什麼阻止你嘗試?我的建議是:首先學習Java,至少足夠好以便能夠編寫它 – Stultuske

+0

好的。祝一切順利。請繼續。讓我們知道你是否陷入中間。 –

+2

公共假期呢? –

回答

0

試試這個。

 boolean work = true; 
     int day = 0; // 0 = today, 1 = yesterday etc... 
     int subDay = 0; // subtract day 


     while (work){ 
     Calendar cal = Calendar.getInstance(); // get current time 
     cal.add(Calendar.DAY_OF_WEEK, subDay); // subtract day 

     // working days are Mon, Tue, Wed, Thu, Fri. If we get saturdays or sundays, we want to skip that days, 
     // so we use if declaration 


     if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { 
      subDay--; 
      continue; 
     } 



      Date tday=cal.getTime(); 
      SimpleDateFormat dy = new SimpleDateFormat("EEE"); 
      String d9 = dy.format(tday); 
      System.out.println("Day: " + day + " - " + d9); 

      day ++; 
      subDay--; 

      if (day >= 10){work=false;} // here we declara how much day we want to go back, and we break loop. 

     } 
+0

你能解釋一下你的代碼嗎? – Perneel

+1

我加了一些評論,希望現在一切都清楚了。 – Gillven

0

避免j.u.Date

第一個錯誤是使用與Java捆綁java.util.Date和.Calendar類。他們是非常麻煩的。避免它們。

使用體面的日期時間庫。在Java中,這意味着無論是:在Java中8(由喬達時間的啓發)

兩者都有自己的優點和缺點。

兩者均提供LocalDate類,您只需表示一個不含日期的部分即可。

日期,時間與文本

問題的代碼融合了他們的字符串表示日期時間值。最好使用日期時間值完成工作。之後,分別創建用於呈現給用戶的字符串表示形式。這個想法是一個separation of concerns,使您的代碼更清晰,更容易測試/調試。

Joda-Time

Java-Time中的示例代碼。

您必須指定一週中的哪些日子爲營業日。

請注意使用時區。當前日期取決於您在地球上的位置(時區)。巴黎的一個新日子早於蒙特利爾。如果您省略時區,則應用JVM的默認值。更好地指定,即使通過調用getDefault(),也不要依賴隱式默認值。

首先我們收集所需日期時間值的集合。

int requiredCountOfDays = 10; // The Question demands 10 previous working days. 
List<LocalDate> days = new ArrayList<LocalDate>(requiredCountOfDays); // Collect desired LocalDate objects. 
DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris"); // Specify time zone by which to get current date. 
LocalDate today = LocalDate.now(timeZone); // Get the current date at this moment in specified time zone. 
LocalDate localDate = today; // Define var to decrement for previous days. 
while (days.size() < requiredCountOfDays) { // Loop until we fill the list (10 elements). 
    localDate = localDate.minusDays(1); // Decrement to get previous day. 
    // Hard-code what days are business days vs weekend days. 
    boolean isWeekend = ((localDate.getDayOfWeek() == DateTimeConstants.SATURDAY) || (localDate.getDayOfWeek() == DateTimeConstants.SUNDAY)); // Hard-coding for weekend because it is easier to type than coding for the more numerous week days. 
    if (!isWeekend) { // If business day… 
     days.add(localDate); // …collect this day. 
    } 
} 

之後,我們以本地化的字符串格式顯示這些值。

List<String> daysOfWeek = new ArrayList<String>(days.size()); // Collect the same number of LocalDate objects, rendered as Strings. 
DateTimeFormatter formatter = DateTimeFormat.forPattern("EEE"); // Generate name of day-of-week, abbreviated. 
for (LocalDate day : days) { 
    String dayOfWeek = formatter.print(day); // Generate String representation. 
    daysOfWeek.add(dayOfWeek); // Collect the string. 
} 

轉儲到控制檯...

System.out.println("days: " + days); 
System.out.println("daysOfWeek: " + daysOfWeek); 

當運行...

days: [2014-06-18, 2014-06-17, 2014-06-16, 2014-06-13, 2014-06-12, 2014-06-11, 2014-06-10, 2014-06-09, 2014-06-06, 2014-06-05] 
daysOfWeek: [Wed, Tue, Mon, Fri, Thu, Wed, Tue, Mon, Fri, Thu] 
要編寫的代碼