добавить более 30 дней с помощью метода add () Календаря в Java - PullRequest
14 голосов
/ 24 марта 2010

Я не совсем уверен, какое поле использовать при добавлении более 30 дней к объекту Java Calendar. Есть ли разница между Calendar.DAY_OF_MONTH и Calendar.DAY_OF_YEAR?

Пример:

GregorianCalendar d = new GregorianCalendar();
d.add(Calendar.DAY_OF_YEAR, 90);

против

GregorianCalendar d = new GregorianCalendar();
d.add(Calendar.DAY_OF_MONTH, 90);

Спасибо.

Ответы [ 2 ]

17 голосов
/ 24 марта 2010

Я не думаю, что это имеет значение, когда вы звоните добавить. Различие важно, когда вы звоните добытчикам.

Оба метода работают нормально, верно? Более 30 дней, а также отрицательные суммы.

(по общему признанию сложный) источник для GregorianCalendar # add имеет этот раздел:

 case DAY_OF_MONTH: // synonym of DATE
 case DAY_OF_YEAR:
 case DAY_OF_WEEK:
    break;
0 голосов
/ 25 марта 2017

ТЛ; др

LocalDate.now( ZoneId.of( "America/Montreal" ) )
         .plusDays( 30 )

Подробнее

Теперь намного проще с современными классами java.time, которые вытесняют старые Calendar & Date классы.

LocalDate

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

Часовой пояс имеет решающее значение при определении даты. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париж, Франция - это новый день, который все еще "вчера" в Монреаль Квебек .

Укажите собственное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте 3-4-буквенное сокращение, такое как EST или IST, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

Вы можете добавить к этому количество дней.

LocalDate later = today.plusDays( 30 );

Period

Вы можете представить промежуток времени с классом Period.

Period thirtyDays = Period.ofDays( 30 );

Вы можете выполнить математику даты, вызвав plus или minus методы.

LocalDate later = today.plus( thirtyDays );

О java.time

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

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...