我创建了一个类,该类代表图书馆系统的可能用户。创建此实例时,我需要设置两个字段: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
变为false。但是我不明白那个领域的含义。
有人可以帮我吗?
答案 0 :(得分:1)
一个GregorianCalendar
的错误(?),您可以在添加5年后调用getTime
以“刷新”该错误:
signingUpDate.add(Calendar.YEAR, 5);
signingUpDate.getTime();
另一种解决方案,请改用java.time
包,例如java.time.LocalDate
。
答案 1 :(得分:1)
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
。