2014-09-03 54 views
3

一段時間以來一直在與這個問題搏鬥,會喜歡一些輸入。拉一天中某一天的特定日期的所有日期 - Java

我想解決的問題是收集某一特定年份的所有日期,例如2014年的每個星期二。這些日期存儲在ArrayList<Date>中。這個列表然後返回。

還必須驗證以確保年份不是0,並且提交的星期幾必須是1-7之間的數字。

如果有任何問題,我很想知道我搞砸了什麼。

public List<Date> getDatesforDayOfWeek(int year, int dayOfWeek) throws InvalidDateException, ParseException { 

    List<Date> dateList = new ArrayList<>(); 

    if (year <= 0 || (1 > dayOfWeek && dayOfWeek > 7)) { 

     throw new InvalidDateException("Year or day of week is invalid."); 

    } else { 

     Calendar newCal = Calendar.getInstance(); 
     newCal.set(YEAR, year); 
     newCal.set(DAY_OF_YEAR, 1); 



     while (newCal.get(YEAR) < year + 1) { 

      int currentDayOfWeek = newCal.get(DAY_OF_WEEK); 

      Date newDate = null; 
      if (currentDayOfWeek >= dayOfWeek) { 

       int dayOfMonth = newCal.get(DAY_OF_MONTH); 
       String strDayOfMonth = String.valueOf(dayOfMonth); 
       String strYear = String.valueOf(year); 

       DateUtility d1 = new DateUtility(); 
       Date passDate = newCal.getTime(); 

       String weekDay = d1.getWeekDayNameAbbreviation(passDate); 
       String monthAbbreviation = d1.getMonthAbbreviation(passDate); 


       String finalString = new String(); 

       finalString.concat(weekDay).concat(" "). 
         concat(monthAbbreviation).concat(" "). 
         concat(strDayOfMonth).concat(" "). 
         concat(strYear); 

       SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd YYYY"); 
       Date theDate = format.parse(finalString); 

       dateList.add(theDate); 
      } 
      newCal.add(Calendar.DATE, 1); 
     } 

    } 
    return (dateList); 
} 
+0

開始與當年的第一個星期二,並不斷添加'7'天,直到你看到今年 – 2014-09-03 17:18:57

+0

的變化@JigarJoshi我認爲同樣的事情,但也許是TC擔心幾年如1582? – Durandal 2014-09-03 17:27:23

+0

1582 @Durandal的特別之處是什麼? – 2014-09-03 17:29:04

回答

1

你的問題沒有指定是一週的第一天,但​​事情是由你的測試一週的當天方法進一步複雜化。讓我們通過使用Calendar標準爲期一週的驗證天開始,

private static boolean isValidDayOfWeek(int dayOfWeek) { 
    switch (dayOfWeek) { 
    // Seven days of the week. 
    case Calendar.SUNDAY: case Calendar.MONDAY: case Calendar.TUESDAY: 
    case Calendar.WEDNESDAY: case Calendar.THURSDAY: case Calendar.FRIDAY: 
    case Calendar.SATURDAY: 
     return true; 
    } 
    return false; 
} 

那麼它遵循,我們可以這樣做,

public static List<Date> getDatesforDayOfWeek(int year, int dayOfWeek) { 
    List<Date> dateList = new ArrayList<>(); 
    if (year <= 0 || !isValidDayOfWeek(dayOfWeek)) { 
     return null; 
    } else { 
     Calendar newCal = Calendar.getInstance(); 
     newCal.set(Calendar.YEAR, year); 
     newCal.set(Calendar.DAY_OF_YEAR, 1); 
     // First, let's loop until we're at the correct day of the week. 
     while (newCal.get(Calendar.DAY_OF_WEEK) != dayOfWeek) { 
      newCal.add(Calendar.DAY_OF_MONTH, 1); 
     } 
     // Now, add the Date to the List. Then add a week and loop (stop 
     // when the year changes). 
     do { 
      dateList.add(newCal.getTime()); 
      newCal.add(Calendar.DAY_OF_MONTH, 7); 
     } while (newCal.get(Calendar.YEAR) == year); 
    } 
    return dateList; 
} 

main()離開我們。因此,要在2014年讓每個星期二,你可以再使用 -

public static void main(String[] args) { 
    List<Date> tuesdays = getDatesforDayOfWeek(2014, Calendar.TUESDAY); 
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 
    for (Date d : tuesdays) { 
     System.out.println(df.format(d)); 
    } 
} 
+0

由於每週只有7天,因此DAY_OF_WEEK不允許使用第1-7天。每個數字代表一週中的一天,1代表星期一。這就是爲什麼我試圖以這種方式進行驗證。感謝所有其他幫助!還在繼續與java握手。 – TheCrownedPixel 2014-09-04 22:41:40

+0

@TheCrownedPixel每['Calendar'](http://docs.oracle.com/javase/7/docs/api/constant-values.html#java.util.Calendar.SUNDAY)的Javadoc,1是'SUNDAY' 。 – 2014-09-05 02:47:17

0

我覺得你的問題主要出在這種情況下

if (currentDayOfWeek >= dayOfWeek) { 

因爲這將任何一天比天「高」算你要。如果你通過3,它也會計算任何高於3的日子,這不是你想要的。

的條件應該是

if (currentDayOfWeek == dayOfWeek) { 

我也建議你使用Calendar getTime method的,而不是分析String,讓您的Date

0

ISO 8601

的ISO 8601標準的日期 - 時間週一的工作定義爲一週的第一天,由數字1日確定爲7

避免juDate & .Calendar

與java捆綁在一起的java.util.Date和.Calendar類是非常麻煩的。避免它們。它們已經在Java 8中被新的java.time包所取代。該套件受到Joda-Time的啓發,該解決方案仍然是一個積極有效的項目,具有一些優勢。

默認情況下,Joda-Time和java.time都使用ISO 8601。

日期 - 只有

對於這個問題,我們只需要日期,而不是時間的日或時區。 Joda-Time和java.time都爲此提供了LocalDate類。

喬達時間

這裏是在一年收集所有的星期二在喬達時間2.4一些示例代碼。

int year = 2014; 
String input = year + "-01-01"; 
LocalDate localDateInput = LocalDate.parse(input); 
LocalDate firstTuesday = localDateInput.withDayOfWeek (DateTimeConstants.TUESDAY); 
LocalDate tuesday = firstTuesday; // for incrementing by week. 
List<LocalDate> list = new ArrayList<>(); 
while (tuesday.getYear() == year) { 
    list.add(tuesday); 
    tuesday.plusWeeks(1); 
}