【发布时间】:2018-03-14 00:14:45
【问题描述】:
我目前正在努力解决Java.Util.Calendar
我有一种方法可以创建一个日历,其中包含年、月和日的随机值。
public Calendar getRandomGeburtstag() {
int year = 1999 - (int) (Math.random() * 80);
int month = (int) (Math.random() * 12) + 1;
int monthLength = 28;
int day = (int) (Math.random() * monthLength) + 1;
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(year, month, day);
return calendar;
}
我将此日历存储在“Person”类中,该类有一个简单的 getter 方法。
然后我在两个不同的场合要求那个日历。
对象在此期间没有改变。
打印日历会给出两种不同的输出:
java.util.GregorianCalendar[areAllFieldsSet=false,ERA=?,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=?,HOUR=?,HOUR_OF_DAY=?,MINUTE=?,SECOND=?,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
和
java.util.GregorianCalendar[areAllFieldsSet=true,ERA=1,WEEK_OF_YEAR=52,WEEK_OF_MONTH=5,DAY_OF_YEAR=362,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=3600000,DST_OFFSET=0]
(我省略了保持不变的字段,它们都在两个打印输出中设置)
如您所见,之前未设置的所有字段都在两个请求之间的某处获得了默认值或计算值。
请求之间没有使用反对,因此它可能是 JVM。
问题是,ZONE_OFFSET 字段被我无权访问的方法使用。只有在给出ZONE_OFFSET=? 时才会打印所需的输出。
有什么办法可以停止这些值的自动分配?
【问题讨论】:
-
我会尝试调试您的代码,同时在
Calendar.internalSet(int, int)方法中设置断点以查看您的对象在哪里被更改。 JVM 不太可能更改您的对象,因为Calendar不是单例。一种解决方法是使用不可变类型,但LocalDate仅在 8+ 中可用。 -
对于 Java 6 和 7,
LocalDate可通过ThreeTen Backport 获得。 @KarolDowbecki 我同意推荐它。 -
所以这发生了一个相当尴尬的转折。我用@KarolDowbecki 的建议调试了代码。事实证明,我只是不知道我的遗留代码实际上做了什么。在某些时候(出于无法理解的原因),它实际上会更改我提供给它的日历。在我认为它会在克隆中进行所有更改之前。给遗留代码一个克隆解决了这个问题。
-
现在我真的不知道如何处理这个问题。问题本身现在无效(因为所描述的问题首先不存在)但答案仍然有效。 Stackoverflow 告诉我不要删除问题,以便其他人可以使用给定的信息。但我不确定这个问题是否有帮助。
-
你是对的,你应该把问题留在这里,这样其他读者可能会从答案中受益。很好,你解决了。
标签: java java-7 java.util.calendar