Недавно я столкнулся с задачей, когда мне нужно получить все пятницы в диапазоне дат. Я написал небольшой фрагмент кода и был удивлен, увидев странное поведение.
Ниже мой код:
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;
}
}
Теперь, когда я запустил код, я заметил, что пятницы 2011 года отсутствуют. После некоторой отладки и онлайн-просмотра я понял, что Calendar.WEEK_OF_YEAR
является специфичным для локали, и я должен использовать setMinimalDaysInFirstWeek(7)
для его исправления.
Так раскоментирована соответствующая строка в приведенном выше коде.
Из того, что я понял, теперь первая неделя года должна начинаться с полной недели года.
Например, 1 января 2010 года в пятницу. Но он не должен появляться в результатах, поскольку я настроил его на то, чтобы эта неделя начиналась с 3 января. Но теперь я все еще вижу 1 января как пятницу
Я очень смущен. Может кто-нибудь объяснить, почему это происходит?
Эти статьи Stackoverflow немного помогли мне: