2013-06-11 2 views
-1

Я хочу перебирать диапазоны дат без использования библиотек (например, 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); 
     } 
    } 
} 
+1

Почему вы используете календарь, когда доступны лучшие альтернативы? – vikingsteve

+4

Месяцы индексируются с 0. 0-> JAN, 1-> FEB ..... –

+3

Просто потому, что никто не упоминал об этом еще - JavaDoc для класса Calendar сказал бы вам об этом http://docs.oracle.com /javase/6/docs/api/java/util/Calendar.html#MONTH. Это должен быть ваш порт-вызов, если вы видите поведение, которого вы не ожидаете от библиотеки. –

ответ

7

месяц, что возвращение библиотеки начинается с 0 .. 11

Кроме того, ваш цикл может быть упрощена это понравилось. Обратите внимание, что это может быть не лучшее решение.

while(!start.after(end)) 
{ 
    int year = start.get(Calendar.YEAR); 
    int month = start.get(Calendar.MONTH) + 1; 
    int day = start.get(Calendar.DAY_OF_MONTH); 
    System.out.printf("%d.%d.%d\n", day, month, year);   
    start.add(Calendar.DATE, 1); 
}