Java GregorianCalendar и Календарь пропускают выходные дни, дни в месяце на август и сентябрь 2010 года - PullRequest
0 голосов
/ 13 сентября 2010

Я пытаюсь использовать календарь или григорианский календарь для итерации и создания сетки дат.Тем не менее оба они считают, что в августе 2010 года 30 дней, а 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 ]

9 голосов
/ 13 сентября 2010

Я сильно подозреваю, что вы не принимаете во внимание тот факт, что месяц основан на 0. Итак, это:

startDate.set(2010, 8, 28);

устанавливает его на сентябрь 28th 2010. Вы еще не сказали, что ожидаете, но я подозреваю, что вы хотели август (в java.util.Calendar месяц 7). *

Я подозреваю, что это проблема, учитывая, что Октябрь 2-е и 3-е - суббота и воскресенье.

Могу ли я настоятельно рекомендовать вам использовать Joda Time в качестве API даты и времени вместо java.util. {Date, Calendar}? Встроенные классы имеют много подобных ошибок.

3 голосов
/ 13 сентября 2010

Если вы хотите продолжать использовать java.util.Calendar, вам, вероятно, следует также использовать константы Calendar.JANUARY, Calendar.FEBRUARY и т. Д.

0 голосов
/ 13 сентября 2010

Как уже упоминали другие, это может быть одна из распространенных ошибок "off by one", которые помогает делать этот дизайн библиотеки. Java API - это более или менее некоторая упаковка метки времени UNIX, в значительной степени вдохновленная некоторой библиотекой C.

Вы должны по крайней мере использовать соответствующие перечисления для улучшения читабельности и не передавать объекты Date / Calendar другим методам, которые могут работать с некоторым неизменным представлением (String, Long, ...) данных в зависимости от использования. случай.

Если вы активно участвуете в Times, Dates и Calendars, вам следует рассмотреть возможность использования JodaTime и изучить JSR 310 , API даты и времени, который может появиться в будущем выпуске Java .

...