Я хочу перебирать диапазоны дат без использования библиотек (например, Joda). Я написал этот простой код, но получил странные результаты. Например, для даты 2010-01-01 2010-02-01 печатает:Итерация в диапазоне дат Java, странные результаты
1.0.2010
2.0.2010
3.0.2010
4.0.2010
5.0.2010
6.0.2010
7.0.2010
8.0.2010
9.0.2010
10.0.2010
11.0.2010
12.0.2010
13.0.2010
14.0.2010
15.0.2010
16.0.2010
17.0.2010
18.0.2010
19.0.2010
20.0.2010
21.0.2010
22.0.2010
23.0.2010
24.0.2010
25.0.2010
26.0.2010
27.0.2010
28.0.2010
29.0.2010
30.0.2010
31.0.2010
1.1.2010
проблема существует также для дат: 2010-05-01 2010-06-01 (принты апреля вместо мая). Любая помощь?
import java.util.Calendar;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.text.DateFormatSymbols;
import java.util.Locale;
import java.util.Map;
import java.util.HashMap;
import javax.swing.JOptionPane;
import java.util.GregorianCalendar;
class test
{
public static void main(String[] args) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = null, endDate = null;
try
{
startDate = dateFormat.parse("2010-01-01"); // or 2010-05-01
endDate = dateFormat.parse("2010-02-01"); // or 2010-06-01
}
catch (ParseException pe)
{
System.exit(-1);
}
Calendar start = Calendar.getInstance();
start.setTime(startDate);
Calendar end = Calendar.getInstance();
end.setTime(endDate);
for (Date date = start.getTime(); !start.after(end); start.add(Calendar.DATE, 1), date = start.getTime())
{
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
int dow = cal.get(Calendar.DAY_OF_WEEK);
System.out.printf("%d.%d.%d\n", day, month, year);
}
}
}
Почему вы используете календарь, когда доступны лучшие альтернативы? – vikingsteve
Месяцы индексируются с 0. 0-> JAN, 1-> FEB ..... –
Просто потому, что никто не упоминал об этом еще - JavaDoc для класса Calendar сказал бы вам об этом http://docs.oracle.com /javase/6/docs/api/java/util/Calendar.html#MONTH. Это должен быть ваш порт-вызов, если вы видите поведение, которого вы не ожидаете от библиотеки. –