Java GregorianCalendar和Calendar错误放置周末,2010年8月和9月的一个月内

时间:2010-09-13 12:47:52

标签: java android gregorian-calendar

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

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);
   }
  }
 }

3 个答案:

答案 0 :(得分:9)

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

startDate.set(2010, 8, 28);

将其设置为九月 2010年第28期。您还没有说出您的期望,但我怀疑您想要八月(java.util.Calendar中的第7个月)。< / p>

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

我是否强烈建议您使用Joda Time作为日期和时间API而不是java.util。{Date,Calendar}?内置类有很多类似的问题。

答案 1 :(得分:3)

如果您想继续使用java.util.Calendar,您可能还应该使用Calendar.JANUARYCalendar.FEBRUARY等常量。

答案 2 :(得分:0)

正如其他人已经提到过的,这可能是这个库设计有助于实现的一些常见的“一个一个”错误。 Java API或多或少地包含了一些主要受某些C库启发的UNIX时间戳。

您至少应该使用适当的Enumerations来提高可读性,并确保不将Date / Calendar对象传递给其他方法,这些方法可以根据用途使用数据的某些不可变表示(String,Long,...)情况下。

如果您大量参与时间,日期和日历,则应考虑使用JodaTime并查看JSR 310,日期和时间API,可能会出现在未来的Java版本中。