java.time
public class User {
private static final ZoneId ZONE = ZoneId.of("America/Kentucky/Monticello");
private static final Period VALIDITY = Period.ofYears(5);
private LocalDate signingUpDate;
private LocalDate expirationDate;
public User() {
setSigningUpDate();
setExpirationDate();
}
private void setSigningUpDate() {
this.signingUpDate = LocalDate.now(ZONE);
}
private void setExpirationDate() {
this.expirationDate = signingUpDate.plus(VALIDITY);
}
@Override
public String toString() {
return "Signed up " + signingUpDate + " expires " + expirationDate;
}
}
java.time, современный API даты и времени Java, не имеет неприятных сюрпризов GregorianCalendar
и других классов даты и времени из Java 1.0 и 1.1.Таким образом, хорошее решение состоит в том, чтобы пропустить старые классы и использовать вместо них современные.
Что пошло не так в вашем коде?
Ничего не было действительно неправильно в вашем коде.Я также не совсем уверен, что вас смутило, но класс GregorianCalendar
определенно сбивает с толку, поэтому я тоже не удивлен.Возможно, вы заглянули внутрь объекта GregorianCalendar
в своем отладчике и увидели, что год не изменился, а areFieldsSet
был изменен на false.Они пытались задокументировать это запутанное поведение, но поскольку оно настолько неестественно и отличается от того, что вы ожидаете, документацию также трудно читать и понимать.
Ссылка
Oracleучебное пособие: Дата Время , объясняющее, как использовать java.time
.