2

I'm trying to enter a start date, an end date, and obtain all the dates in between. I have the formatting where I need it, I have Joda-Time ready to go, but...past that, I'm stuck. I've included what I have working, as well as what is not going.

So far, I have the following code (working):

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
DateFormat sysDate = new SimpleDateFormat("ddMMyyyy");

//Get Start Date
Date str_date = jXDatePicker1.getDate();
jXDatePicker1.setFormats(dateFormat);
String startDate = sysDate.format(jXDatePicker1.getDate());

//Get End Date
Date end_date = jXDatePicker2.getDate();
jXDatePicker2.setFormats(dateFormat);
String endDate = sysDate.format(jXDatePicker2.getDate());

And here's what I'm trying to implement but to no success:

List<LocalDate> dates = new ArrayList<LocalDate>();
int days = Days.daysBetween(startDate, endDate).getDays();
for (int i=0; i < days; i++) {
    LocalDate d = startDate.withFieldAdded(DurationFieldType.days(), i);
    dates.add(d);
}

Thank you in advance.

Basil Bourque
  • 303,325
  • 100
  • 852
  • 1,154
FrankCapone
  • 51
  • 2
  • 7
  • More duplicates: [this](http://stackoverflow.com/q/12083053/642706) and [this](http://stackoverflow.com/q/2689379/642706). – Basil Bourque Mar 10 '16 at 03:38

2 Answers2

1

I'm not sure if int days = Days.daysBetween(startDate, endDate).getDays(); will work, assuming the startDate and endDate are still Strings

Instead, you should use the str_date and end_date values instead, maybe something more like...

int days = Days.daysBetween(new LocalDate(str_date), new LocalDate(end_date)).getDays();
System.out.println(days);

Try and remember, in general the "format" of the date/time is irrelevant, instead, you want to work with the actual values (of the date/time) and when you need to display, then format then as required

Normally I just keep looping while the date is before the end date, something like...

Random rnd = new Random();
LocalDate start = new LocalDate(2015, DateTimeConstants.SEPTEMBER, 1);
LocalDate end = start.plusDays(rnd.nextInt(200));

List<LocalDate> dates = new ArrayList<>(25);
dates.add(start);
while (start.isBefore(end)) {
    start = start.plusDays(1);
    dates.add(start);
}

for (LocalDate date : dates) {
    System.out.println(date);
}

This is inclusive, from the start date to the end date and this example simply generates a list of dates from the start date to a random number of days in the future

MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
  • Good answer, but I suggest passing a specific [`DateTimeZone`](http://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeZone.html) to the [constructor](http://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeZone.html) of `LocalDate` rather than relying implicitly on the JVM’s current default time zone. The time zone is crucial in determining a date. – Basil Bourque Sep 06 '15 at 18:10
  • Thanks for the help. I actually used some of your items and a little more to get the solution I've posted here as an answer. Thank you! – FrankCapone Sep 06 '15 at 20:19
  • @BasilBourque Good point – MadProgrammer Sep 06 '15 at 22:13
0

I ended up getting the desired results with a mixture of what MadProgrammer offered and a few tweaks I got around the web. There is a likely a better way to do it, but here's what works for me:

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
       DateFormat sysDate = new SimpleDateFormat("ddMMyyyy");

       //Get Start Date
        Date str_date = jXDatePicker1.getDate();
        jXDatePicker1.setFormats(dateFormat);
        String startDate = sysDate.format(jXDatePicker1.getDate());

        //Get End Date
        Date end_date = jXDatePicker2.getDate();
        jXDatePicker2.setFormats(dateFormat);
        String endDate = sysDate.format(jXDatePicker2.getDate());

        List<Date> dates = new ArrayList<Date>(25);
        Calendar cal = Calendar.getInstance();
        cal.setTime(str_date);
        while (cal.getTime().before(end_date)) {
            cal.add(Calendar.DATE, 1);
            dates.add(cal.getTime());
        }       

        List<String> stringDates = new ArrayList<String>(dates.size());
        for (Date mdates : dates){
            String date = sysDate.format(mdates);
            stringDates.add(String.valueOf(date));
        }

        System.out.println(stringDates);
FrankCapone
  • 51
  • 2
  • 7