2015-09-05 3 views
2

Я пытаюсь ввести дату начала, дату окончания и получить все даты между ними. У меня есть форматирование, где мне это нужно, у меня есть Joda-Time готов к работе, но ... мимо этого, я застрял. Я включил то, что у меня работает, а также то, что не происходит.Java: укажите даты между датой начала и окончания

До сих пор, у меня есть следующий код (рабочий):

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<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); 
} 

Спасибо заранее.

+0

Более дубликаты: [это] (http://stackoverflow.com/q/12083053/642706) и [это] (http://stackoverflow.com/q/2689379/642706). –

ответ

1

Я не уверен, если int days = Days.daysBetween(startDate, endDate).getDays(); будет работать, если предположить, что startDate и endDate еще String s

Вместо этого следует использовать значения по str_date и end_date вместо этого, может быть что-то больше похоже на ...

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

Помните, что «формат» даты/времени не имеет значения, вместо этого вы хотите работать с фактическими значениями (даты/времени) и когда вам нужно отображать, а затем форматировать по мере необходимости

Обычно я просто держать цикл в то время как дата до даты окончания, что-то вроде ...

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); 
} 

Это включительно с даты начала до даты окончания и этот пример просто генерирует список даты от даты начала до случайного числа дней в будущем

+0

Хороший ответ, но я предлагаю передать [DateTimeZone'] (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeZone.html) в конструктор [http: //www.joda.org/joda-time/apidocs/org/joda/time/DateTimeZone.html) «LocalDate» вместо того, чтобы неявно ссылаться на текущий часовой пояс JVM. Часовой пояс имеет решающее значение для определения даты. –

+0

Спасибо за помощь. Я фактически использовал некоторые из ваших предметов и немного больше, чтобы получить решение, которое я разместил здесь в качестве ответа. Спасибо! – FrankCapone

+0

@BasilBourque Хорошая точка – MadProgrammer

0

В итоге я получил желаемые результаты со смесью того, что предложил MadProgrammer, и несколько настроек, которые я получил по сети. Существует вероятный лучший способ сделать это, но вот то, что работает для меня:

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);