2013-05-24 3 views
1

Я сделал небольшую программу для подсчета дней. посчитать 150 дней с 22 мая. Но результат - 18 октября. Фактическая дата - 19 октября. Может ли кто-нибудь помочь мне найти, что не так с моим кодом.Java Calendar Issue


Calendar mine = new GregorianCalendar(2013, Calendar.MAY,22); 
    int month = Calendar.MAY; 
    int counter = 0; 
    for(int i=mine.get(Calendar.DAY_OF_MONTH);i<=mine.getActualMaximum(Calendar.DAY_OF_MONTH);i++){ 
    System.out.println("i "+i); 

     counter++; 
     System.out.println("counter "+counter); 
    if(i==mine.getActualMaximum(Calendar.DAY_OF_MONTH)){ 
     month++; 
     i=1; 

     mine.set(2013, month, i); 
     counter++; 
     System.out.println("i "+i+" "+mine.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH)); 
     if(counter == 150){ 

     System.out.println("day "+i+ counter +"days"+ "month:"+ mine.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH)); 
     break; 
     } 
    } 
     if(counter == 150){ 

     System.out.println("i "+i+" counter "+ counter +" date:"+mine.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH)); 
     break; 
     } 
     } 
+2

Если вы НЕОБХОДИМО использовать «Календарь», было бы лучше использовать [Joda Time] (http://joda-time.sourceforge.net/) – MadProgrammer

+0

oh Я думал, что календарь - это мой единственный вариант. Благодарю. Я должен попробовать Joda Time. – shan

+0

Joda Time берет на себя лучшие високосные годы и секунды, а странность вокруг границ века ... – MadProgrammer

ответ

2

Tl; Др

LocalDate.of(2013, Month.MAY, 22) 
     .plusDays(150) 

Использование java.time

Намного проще с современные классы java.time.

Класс LocalDate представляет собой значение только для даты без времени суток и без часового пояса.

Monthenum предлагает десяток предопределенных объектов, по одному на каждый месяц в году.

LocalDate ld = LocalDate.of(2013, Month.MAY, 22) ; 
LocalDate later = ld.plusDays(150); 

См. this code live at IdeOne.com.

2013-10-19


О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8 и SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и more.

+0

Цените свой ответ даже после долгого времени, но я хорошо понимаю. – shan

3

Вы можете просто использовать add функцию Calendar

Calendar mine = new GregorianCalendar(2013, Calendar.MAY,22); 
mine.add(Calendar.DAY_OF_YEAR, 150); 
System.out.println(mine.getTime()); 

напечатает

Sat Oct 19 00:00:00 IST 2013 

Но реальная проблема с вашим кодом, что вы были увеличивающиеся counter первый и затем делает сравнение с 150.

сделать это так, и он должен исправить код

if(counter == 150){ 
    System.out.println("i "+i+" counter "+ counter +date:"+mine.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH)); 
    break; 
} 
counter++; 
+2

+1 избили меня до этого – MadProgrammer

+0

wow ... спасибо. Как глупо я пропустил это. – shan

+0

Да, проблема решена. – shan

2

Или вы могли бы использовать Joda DateTime:

import org.joda.time.DateTime; 
.... 
System.out.println(new DateTime("2013-05-22").plusDays(150)); 
+0

+1 для времени Джоды – shan

+0

FYI, проект [Joda-Time] (http://www.joda.org/joda-time/) теперь находится в [режиме обслуживания] (https://en.wikipedia.org/ wiki/Maintenance_mode), а команда советует перейти на классы [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). –

+0

@BasilBourque правильный. Каждый - пожалуйста, см. Ответ Василия, я повышаю его, он должен подняться на вершину. – vikingsteve