2015-04-06 16 views
5

Potrzebuję twojej pomocy w uzyskaniu listy miesięcy i lat w String między dwiema datami. Użytkownik wejdzie dwie daty w formacie ciągu dnia:Jak uzyskać listę miesięcy i lat między dwiema datami

String date1 ="JAN-2015"; 
String date2 ="APR-2015"; 

więc wynik powinien być:

  • Jan-2015
  • lut-2015
  • MAR-2015

Próbowałem użyć następującego kodu, ale dało mi to złe wyniki:

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

String str_date ="JAN-2015"; 
String end_date ="APR-2015"; 

DateFormat formatter ; 

formatter = new SimpleDateFormat("MMM-yyyy"); 
Date startDate = formatter.parse(str_date); 
Date endDate = formatter.parse(end_date); 
long endTime =endDate.getTime() ; 
long curTime = startDate.getTime(); 
while (curTime <= endTime) { 
    dates.add(new Date(curTime)); 
    curTime ++; 
} 
for(int i=0;i<dates.size();i++){ 
    Date lDate =(Date)dates.get(i); 
    String ds = formatter.format(lDate);  
    System.out.println(ds); 
} 
+0

Podaj szczegółowe informacje o uzyskanych wynikach i o tym, co zrobiłeś, aby znaleźć problem. – kaylum

+0

Mam błąd przestrzeni sterty Java – 99maas

+0

'curTime' jest czasem w milisekundach. Oznacza to, że miesiąc wynosi około 30 dni × 24 godziny × 60 minut × 60 sekund × 1000 milisekund, a inkrementujesz go o jedną milisekundę w każdej iteracji. – RealSkeptic

Odpowiedz

5

Korzystanie z mniejszej ilości kodu i podstawowych bibliotek java i otrzymywanie rezultatów, o które prosiłeś. Możesz więc modyfikować zmienne date1 i date2.

import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 

public class Main { 
    public static void main(String[] args) { 
     String date1 = "JAN-2015"; 
     String date2 = "APR-2015"; 

     DateFormat formater = new SimpleDateFormat("MMM-yyyy"); 

     Calendar beginCalendar = Calendar.getInstance(); 
     Calendar finishCalendar = Calendar.getInstance(); 

     try { 
      beginCalendar.setTime(formater.parse(date1)); 
      finishCalendar.setTime(formater.parse(date2)); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     while (beginCalendar.before(finishCalendar)) { 
      // add one month to date per loop 
      String date =  formater.format(beginCalendar.getTime()).toUpperCase(); 
      System.out.println(date); 
      beginCalendar.add(Calendar.MONTH, 1); 
     } 
    } 
} 
+0

Coś do zapamiętania: jeśli zapisujesz same instancje kalendarza, pamiętaj o zapisaniu beginCalendar.clone() zamiast samego beginCalendar. – amitav13

1

W przypadku, gdy wersja Java jest < 8 można użyć kalendarz następująco:

private final static DateFormat formatter = new SimpleDateFormat("MMM-yyyy", Locale.ENGLISH); 

public static void main(String[] args) throws ParseException { 
    Calendar startDate = stringToCalendar("Jan-2015"); 
    Calendar endDate = stringToCalendar("Apr-2015"); 

    while (startDate.before(endDate)) { 
     System.out.println(formatter.format(startDate.getTime())); 
     startDate.add(Calendar.MONTH, 1); 
    } 
} 

private static Calendar stringToCalendar(String string) throws ParseException {  
    Date date = formatter.parse(string); 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(date); 
    return calendar; 
} 

Jeśli masz luksus Java 8 następnie kod staje się bardziej prosta:

public static void main(String[] args) {   
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM-yyyy", Locale.ENGLISH); 
    YearMonth startDate = YearMonth.parse("Jan-2015", formatter); 
    YearMonth endDate = YearMonth.parse("Apr-2015", formatter); 

    while(startDate.isBefore(endDate)) { 
     System.out.println(startDate.format(formatter)); 
     startDate = startDate.plusMonths(1); 
    } 
} 
Powiązane problemy