2010-09-13 49 views
0

我正在尝试使用Calendar或Gregorian Calendar来迭代和创建日期网格。然而,他们两人似乎认为2010年8月有30天,而9月2日和3日是周末。就好像日历有错误的一年,但我已经三联检查了这个参数。这里有一些摘录。Java GregorianCalendar和Calendar错位周末,2010年8月和9月的一个月中的天数

startDate.set(2010, 8, 28); 

SchedulerCalendar currentDate = (SchedulerCalendar) startDate.clone(); 
    for(int i = 0; i<daysDisplayed; i++){ 
    newDate = new TextView(this); 
    String dateString = currentDate.get(Calendar.MONTH)+"/"+currentDate.get(Calendar.DATE); 
    //+"/"+currentDate.get(Calendar.YEAR); 
    newDate.setText(dateString); 
    newDate.setId(i+1); 
    newDate.setWidth(blockWidth); 
    newDate.setHeight(DATE_HEIGHT); 
    dateBar.addView(newDate); 
    currentDate.add(Calendar.DATE, 1); 
    } 


private class SchedulerCalendar extends GregorianCalendar { 
    @Override 
    public void add(int field, int value) { 
    super.add(field, value); 
    if(this.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY) { 
    if(value>=0) super.add(Calendar.DATE, 2); 
    if(value<0) super.add(Calendar.DATE, -1); 
    } 
    if(this.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY) { 
    if(value>=0) super.add(Calendar.DATE, 1); 
    if(value<0) super.add(Calendar.DATE, -2); 
    } 
    } 
} 

回答

9

我强烈怀疑你没有考虑到月份为0的事实。所以这个:

startDate.set(2010, 8, 28); 

是九月设置为28日2010年你还没有说你希望它是什么,但我怀疑你想要月(这是7月份在java.util.Calendar中) 。

我怀疑这是问题,因为十月第二和第三是周六和周日。

我可以强烈建议您使用Joda Time作为日期和时间API而不是java.util。{Date,Calendar}?内置的类有很多像这样的陷阱。

3

如果你想继续使用java.util.Calendar,你应该也可以使用Calendar.JANUARYCalendar.FEBRUARY等常数。

0

正如其他人已经提到,它可能是一些常见的“一个”错误,这个库设计有助于。 Java API或多或少地是由一些C库启发的UNIX时间戳的一些包装。

您应该至少使用适当的枚举来提高可读性,并确保不会将Date/Calendar对象传递给其他方法,这些方法可以使用某些数据的不可变表示(String,Long,...),具体取决于用例。

如果您大量参与Times,Dates和Calendars,则应考虑使用JodaTime并查看JSR 310,它可能会出现在未来的Java版本中。