Почему метод add () GregorianCalendar не работает? - PullRequest
0 голосов
/ 04 декабря 2018

Я создал класс, который представляет возможного пользователя для библиотечной системы.На момент создания этого экземпляра мне нужно установить два поля: signingUpDate и expirationDate, оба - григорианский календарь.

signingUpDate - дата в момент создания, а expirationDate - signingUpDate + 5 лет.

public class User {

    private GregorianCalendar signingUpDate;
    private GregorianCalendar expirationDate;

    public User(){
        setSigningUpDate;
        setExpirationDate;
    }

    private void setExpirationDate() {
        this.expirationDate = new GregorianCalendar();
        expirationDate.add(GregorianCalendar.YEAR, 5);
    }

    private void setSigningUpDate() {
        this.signingUpDate=new GregorianCalendar();
    }

Когда я использую метод add(), expirationDate не меняется.Я попытался отладить и заметил, что поле areFieldsSet становится ложным.Но я не понял значения этого поля.Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

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.

0 голосов
/ 04 декабря 2018

Ошибка (?) GregorianCalendar, вы можете вызвать getTime, чтобы «обновить» ее после добавления 5 лет:

signingUpDate.add(Calendar.YEAR, 5);
signingUpDate.getTime();

Другое решение, вместо этого используйте пакет java.time, например,java.time.LocalDate.

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