Добавить более 30 дней с помощью метода add() в Java
Я не совсем уверен, какое поле использовать при добавлении более 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);
Спасибо.
Ответы
Ответ 1
Я не думаю, что это имеет значение, когда вы вызываете add. Различие важно, когда вы вызываете геттеры.
Оба метода работают нормально, не так ли? Более 30 дней, а также отрицательные количества.
(по общему признанию, сложный) источник для GregorianCalendar # add имеет этот раздел:
case DAY_OF_MONTH: // synonym of DATE
case DAY_OF_YEAR:
case DAY_OF_WEEK:
break;
Ответ 2
TL;DR
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 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь режим обслуживания, советуем перейти к классам java.time.
Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация 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
и больше.