2016-11-17 139 views
1

我想獲得的日期列表中的日期範圍介於ISO格式( 「YYYY-MM-DD」),具體如下:如何獲取給定日期範圍內的日期列表?

ArrayList<String> datesList = new ArrayList<String>(); 
try { 
    SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd"); 
    int[] fromDateParts = new int[3]; 
    for (int f = 0; f < fromIsoDate.split("-").length; f++) { 
     fromDateParts[f] = Integer.parseInt(fromIsoDate.split("-")[f]); 
     System.out.println("fromDateParts[" + f + "] : " + fromDateParts[f]); 
    } 
    int[] toDateParts = new int[3]; 
    for (int t = 0; t < toIsoDate.split("-").length; t++) { 
     toDateParts[t] = Integer.parseInt(toIsoDate.split("-")[t]); 
     System.out.println("toDateParts[" + t + "] : " + toDateParts[t]); 
    } 
    Calendar fromDate = new GregorianCalendar(fromDateParts[0], fromDateParts[1], fromDateParts[2]); 
    Calendar toDate = new GregorianCalendar(toDateParts[0], toDateParts[1], toDateParts[2]); 
    System.out.println("fromDate " + fromDate + " toDate " + toDate); 
    boolean hasMoreDays = true; 
    while (hasMoreDays) { 
     if ((fromDate.before(toDate)) || (fromDate.equals(toDate))) { 
      datesList.add(isoFormat.format(fromDate)); 
      fromDate.add(Calendar.DAY_OF_MONTH, 1); 
     } else { 
      hasMoreDays = false; 
     } 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
    System.out.println("Exception : While determining the dates in between " + fromIsoDate + " and " + toIsoDate + "!"); 
} 

但是,它會拋出錯誤:
的java.lang .IllegalArgumentException:無法將給定對象格式化爲日期。

請指導我獲取日期範圍內的日期列表!

+2

是的,因爲你傳遞的是java.util.Calendar而不是java.util.Date。這聽起來像你應該使用'SimpleDateFormat'解析,而不是自己分裂和解析。如果你使用的是Java 8,我強烈推薦使用java.time包,而不是btw。 –

+1

更改爲'isoFormat.format(fromDate.getTime())'將工作 – Jerry06

回答

1

只是包裝開始日期在Calendar和使用:

Date startDate; 
Date endDate; 

Calendar c = Calendar.getInstance(); 
c.setTime(startDate); 
Date dt = startDate; 
List<Date> dates = new ArrayList<>(); 

do { 
    dates.add(dt); 
    c.add(Calendar.DATE, 1); 
    dt = c.getTime(); 
} while (endDate.getTime() > dt.getTime()); 

正如你所期望聽到的,在Java 8 API或可能JodaTime可能使你的生活比使用的Java 7的日期比較容易的方式的東西。

0

如果使用java8你可以寫在一行整體的東西,如下圖所示,我已經使用java.util.Date

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

     Date fromDate = new Date(2016, 11, 02); 
     Date toDate = new Date(2016, 11, 28); 

     dates.add(new Date(2016, 11, 01)); 
     dates.add(new Date(2016, 11, 02)); 
     dates.add(new Date(2016, 11, 03)); 
     dates.add(new Date(2016, 11, 04)); 

     List<Date> filteredDates = dates.stream() 
       .filter((e) -> e.after(fromDate) && e.before(toDate)).collect(Collectors.toList()); 
1

你應該通過一個DateSimpleDateFormat.fotmat inntead的Calendar

datesList.add(isoFormat.format(fromDate)); 

datesList.add(isoFormat.format(fromDate.getTime)); 

以下是我的針對您的要求的解決方案:

String fromStr = "2016-11-01"; 
    String toStr = "2016-11-17"; 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
    Calendar from = Calendar.getInstance(); 
    from.setTime(sdf.parse(fromStr)); 
    Calendar to = Calendar.getInstance(); 
    to.setTime(sdf.parse(toStr)); 

    List<Date> retval = new ArrayList<Date>(); 
    while (from.before(to) || from.equals(to)) { 
     retval.add(from.getTime()); 
     System.out.println(sdf.format(from.getTime())); 
     from.add(Calendar.DATE, 1); 
    } 

希望得到這個幫助!