2014-09-03 45 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); 
}