Holen Sie sich alle Freitage in einem Datumsbereich in Java

Ich bin kürzlich auf eine Aufgabe gestoßen, bei der ich alle Freitage in einem Datumsbereich haben muss. Ich schrieb ein kleines Stück Code und war überrascht, ein merkwürdiges Verhalten zu sehen.

Unten ist mein Code:

public class Friday {
    public static void main(String[]args){
        String start = "01/01/2009";
        String end = "12/09/2013";
        String[] startTokens = start.split("/");
        String[] endTokens = end.split("/");
        Calendar  startCal = new GregorianCalendar(Integer.parseInt(startTokens[2]),Integer.parseInt(startTokens[1])-1,Integer.parseInt(startTokens[0]));
        Calendar endCal = new GregorianCalendar(Integer.parseInt(endTokens[2]),Integer.parseInt(endTokens[1])-1, Integer.parseInt(endTokens[0]));

        int startYear = Integer.parseInt(startTokens[2]);
        int endYear = Integer.parseInt(endTokens[2]); 


        int startWeek = startCal.get(Calendar.WEEK_OF_YEAR);
        int endWeek = endCal.get(Calendar.WEEK_OF_YEAR);

        Calendar cal = new GregorianCalendar();
        cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
    //  cal.setMinimalDaysInFirstWeek(7);
        ArrayList<String> main = new ArrayList<String>();
        while(startYear <= endYear ){
               cal.set(Calendar.YEAR, startYear);
               System.out.println(cal.getMinimalDaysInFirstWeek());
                if(startYear == endYear){
                    main.addAll(getFridays(startWeek, endWeek, cal));
                }
                else{
                    main.addAll(getFridays(startWeek, 52, cal));
                    startWeek = 1;
                }
                startYear =startYear +1;
        }

        for(String s: main){
            System.err.println(s);
        }
    }
    public static ArrayList<String> getFridays(int startWeek, int endWeek, Calendar cal){
        ArrayList<String> fridays = new ArrayList<String>();
        while(startWeek <= endWeek){
            cal.set(Calendar.WEEK_OF_YEAR, startWeek);
            fridays.add(cal.getTime().toString());
            startWeek = startWeek+1;
        }
        return fridays;
    }
}

Jetzt, als ich den Code lief, bemerkte ich, dass Freitags von 2011 fehlen. Nach einigem Debuggen und Online-Browsen habe ich das herausgefundenCalendar.WEEK_OF_YEAR ist länderspezifisch und ich muss verwendensetMinimalDaysInFirstWeek(7) etwas reparieren.

Also die dazugehörige Zeile im obigen Code auskommentieren.

Nach dem, was ich jetzt verstanden habe, sollte die erste Woche des Jahres mit der vollen Woche des Jahres beginnen.

Zum Beispiel ist der 1. Januar 2010 Freitag. Aber es sollte nicht in den Ergebnissen auftauchen, da ich es so konfiguriert habe, dass es diese Woche ab dem 3. Januar behandelt. Aber jetzt sehe ich den 1. Januar noch als Freitag

Ich bin sehr verwirrt. Kann jemand erklären, warum es passiert?

Diese Stackoverflow-Artikel haben mir ein bisschen geholfen:

Warum gibt der 31. Dezember 2010 1 als Woche des Jahres zurück?

Grundlegendes zu java.util.Calendar WEEK_OF_YEAR

Antworten auf die Frage(7)

Ihre Antwort auf die Frage