0

カレンダーまたはグレゴリオ暦を使用して、日付グリッドを繰り返し作成しようとしています。しかし、どちらも 2010 年 8 月は 30 日で、9 月 2 日と 3 日が週末だと思っているようです。カレンダーの年が間違っているようですが、そのパラメーターを 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);

何を期待しているかはまだ言われていませんが、8(java.util.Calendar では 7 番目の月) を希望していたのではないかと思います。

10 月2 日と 3 日が土曜日と日曜日であることを考えると、これが問題だと思います。

java.util.{Date,Calendar} の代わりにJoda Timeを日時 API として使用することを強くお勧めしますか? 組み込みクラスには、このような落とし穴がたくさんあります。

于 2010-09-13T12:51:56.540 に答える
3

を引き続き使用する場合は、、 などの定数java.util.Calendarも使用する必要があります。Calendar.JANUARYCalendar.FEBRUARY

于 2010-09-13T13:17:54.080 に答える
0

他の人がすでに述べたように、このライブラリの設計が役立つ一般的な「1つずつ」エラーの一部である可能性があります。Java API は、多かれ少なかれ UNIX タイムスタンプをラッピングしたものであり、主に一部の C ライブラリに触発されています。

少なくとも適切な列挙型を使用して読みやすさを改善し、ユースケースに応じてデータの不変表現 (String、Long、...) で機能する可能性がある他のメソッドに Date/Calendar オブジェクトを渡さないようにする必要があります。

時間、日付、およびカレンダーに深く関わっている場合は、JodaTimeの使用を検討し、 JSR 310 (将来の Java リリースで登場する可能性のある日付と時刻の API) を調べる必要があります。

于 2010-09-13T14:31:14.867 に答える