0

我正在尝试使用日历或公历来迭代并创建日期网格。但是,他们俩似乎都认为 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);
   }
  }
 }
4

3 回答 3

9

我强烈怀疑您没有考虑到月份是从 0 开始的事实。所以这:

startDate.set(2010, 8, 28);

将其设置为2010 年9 月28 日。您还没有说出您的期望,但我怀疑您想要 8 月(即 java.util.Calendar 中的第 7 个月)。

我怀疑这是问题所在,因为10 月2 日和 3 日是周六和周日。

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

于 2010-09-13T12:51:56.540 回答
3

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

于 2010-09-13T13:17:54.080 回答
0

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

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

如果您与时间、日期和日历密切相关,您应该考虑使用JodaTime并查看JSR 310,即可能出现在未来 Java 版本中的日期和时间 API。

于 2010-09-13T14:31:14.867 回答