为什么GregorianCalendar方法add()不起作用?

时间:2018-12-04 13:25:50

标签: java datetime gregorian-calendar

我创建了一个类,该类代表图书馆系统的可能用户。创建此实例时,我需要设置两个字段:signingUpDateexpirationDate,它们都是公历。

signingUpDate是创建之日,而expirationDatesigningUpDate + 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变为false。但是我不明白那个领域的含义。 有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

一个GregorianCalendar的错误(?),您可以在添加5年后调用getTime以“刷新”该错误:

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

另一种解决方案,请改用java.time包,例如java.time.LocalDate

答案 1 :(得分:1)

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(现代的Java日期和时间API)附带了GregorianCalendar和Java 1.0和1.1中其他日期和时间类的令人惊讶的惊喜。因此,一个好的解决方案是跳过旧类,而改用现代类。

您的代码出了什么问题?

您的代码中没有什么错。我也不太确定是什么让您感到困惑,但是GregorianCalendar类肯定会让您感到困惑,所以我也不感到惊讶。也许您在调试器的GregorianCalendar对象内部查看,发现年份没有变化,areFieldsSet更改为false。他们试图记录这种令人困惑的行为,但是由于它是如此不自然且与您期望的不同,因此该文档也难以阅读和理解。

链接

Oracle tutorial: Date Time解释了如何使用java.time