Generowanie dat z podanego zakresu

0

Witam, Próbowałem napisać sobie klasę, która generuję daty z podanego zakresu za pomocą zmiennych String from, String to (z pominięciem weekendów) i zapisuję do tablicy Dates.
Nie wiem dlaczego ale kalendarz błędnie pomija miesiąc luty dla przykładowego zakresu "2011-01-03","2011-05-14". Traktuję luty jako kwiecień. Dopiero działa dobrze jak dodam instrukcję calendar.get(Calendar.DAY_OF_MONTH); W poniższym kodzie zakomentowałem tą instrukcję. Oto kod:

[code]
package data_proba;
import java.util.;
import java.text.
;
/**
*

  • @Author szarik1988
    */
    public class Data_Proba {

    public static void main(String[] args) {

    MyCalendar c1 = new MyCalendar();
    c1.AddDatesFromRange("2011-01-03","2011-05-14");
    // c1.AddDatesFromRange("2012-01-01","2012-07-07");
    //c1.cutFromCalendar("13-06-2011");
    c1.printDates();
    // while(c1.next()){
    // System.out.println(c1.getDate());
    //}
    }
    }

class MyCalendar{

MyCalendar(){
    index = -1;
    Dates = new ArrayList<String>();
    calendar = GregorianCalendar.getInstance();
}
public  int daysInMonth(GregorianCalendar c) {
     int [] daysInMonths = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    daysInMonths[1] += c.isLeapYear(c.get(GregorianCalendar.YEAR)) ? 1 : 0;
    return daysInMonths[c.get(GregorianCalendar.MONTH)]; 
}
void cutFromCalendar(String date){
    Dates.remove(date);
    
}
public String getDate(){
    
    return Dates.get(index);
    
}
public boolean next(){
    index++;
    if(index>=0 && index < Dates.size())
        return true;
    else
        return false;
    
}
public boolean previous()
{
    index--;
    if(index>=0 && index < Dates.size())
        return true;
    else
        return false;
    
}
    

public void printDates(){
for(int i = 0; i < Dates.size(); i++){
System.out.println(Dates.get(i));
}

}

public void AddDatesFromRange(String from, String to){

    int dayF = Integer.parseInt(from.substring(8,10));
    int monthF = Integer.parseInt(from.substring(5,7));
    int yearF = Integer.parseInt(from.substring(0,4));
    calendar.set(Calendar.YEAR,yearF);
    calendar.set(Calendar.MONTH,monthF-1); 
    calendar.set(Calendar.DAY_OF_MONTH,dayF);
    int dayT = Integer.parseInt(to.substring(8,10));
    int monthT = Integer.parseInt(to.substring(5,7));
    int yearT = Integer.parseInt(to.substring(0,4));
    int NumberOfDays = daysInMonth((GregorianCalendar)calendar);
    while(monthF <= monthT){
        
        
        
        while((dayF <= dayT || monthF <  monthT) && dayF <= NumberOfDays){
            
            
           if(calendar.get(Calendar.DAY_OF_WEEK)!= Calendar.SUNDAY && 
                   calendar.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY ){
            Dates.add(yearF +"-"+(monthF < 10 ? "0" : "")+monthF+"-"+(dayF < 10 ? "0" : "")+ dayF);
            
            }
           dayF++;
           calendar.set(Calendar.DAY_OF_MONTH,dayF);
           //calendar.get(Calendar.DAY_OF_MONTH);
        }
            dayF = 1;
            monthF++;
            calendar.set(Calendar.MONTH,(monthF-1));
            
           NumberOfDays = daysInMonth((GregorianCalendar)calendar);
           
    }
    
    
   
    
   
   

}
int index;
private Calendar calendar;
private ArrayList<String> Dates;
}

[/code]

Ma ktoś pomysł dlaczego tak się dzieję? To jakaś wada klasy, czy ja mam jakiś błąd w kodzie. Patrze na ten kod i nie mogę znaleźć błędu. Pozdrawiam :)

0

U mnie (XP, Java 1.7) działa poprawnie.

0

Pomysł by daty przechowywać jako Stringi jest dość osobliwy. Funkcję tworząca listę dat z podanego zakresu można napisać krócej i uniwersalniej (również lata mogą być różne):

private ArrayList<GregorianCalendar> dates;
...
dates = new ArrayList<GregorianCalendar>();
...
   public void addDatesFromRange(String from, String to)
   {
        int day = Integer.parseInt(from.substring(8,10));
        int month = Integer.parseInt(from.substring(5,7));
        int year = Integer.parseInt(from.substring(0,4));
        GregorianCalendar firstDay = new GregorianCalendar(year,month-1,day);
        day = Integer.parseInt(to.substring(8,10));
        month = Integer.parseInt(to.substring(5,7));
        year = Integer.parseInt(to.substring(0,4));
        GregorianCalendar lastDay = new GregorianCalendar(year,month-1,day);
        while(firstDay.compareTo(lastDay)<0)
        {
            if(firstDay.get(Calendar.DAY_OF_WEEK)!= Calendar.SUNDAY && firstDay.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY )
            {
                dates.add((GregorianCalendar)(firstDay.clone()));
            }
            firstDay.add(Calendar.DAY_OF_MONTH,1); 
        } 
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1