我有一个JCalendar
propertyChangeListener,我在其中使用Calendar newValue = (Calendar) evt.getNewValue()
. 如果旧日期是 31 并且新选择的月份是 30 天的月份之一,当我尝试获取它的值时,newValue.getTime()
它会返回不正确的日期(JCalendar 1.2 中旧月份的 1 日和 Jcalendar 1.4 中旧月份的 30 日)。如果我做 a setLenient=true
,它会抛出Error: java.lang.IllegalArgumentException: MONTH
.
有什么办法可以检查新旧日期和月份并根据要求进行调整?
这是代码:
myCalendar.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("calendar")) {
Calendar updatedValue = (Calendar) evt.getNewValue();
System.out.println(updatedValue); //Prints Month as 10 (Nov) and day as 31
System.out.println(updatedValue.getTime()); //Prints Month as 11 (Dec) and day as 1
}
}
}
示例:当前选定日期 -> 2018 年 12 月 31 日日历返回 ->YEAR=2018,MONTH=11,WEEK_OF_YEAR=48,WEEK_OF_MONTH=1,DAY_OF_MONTH=31
将月份更改为 11 月日历返回 ->YEAR=2018,MONTH=10,WEEK_OF_YEAR=1,WEEK_OF_MONTH=6,DAY_OF_MONTH=31
这实际上是不正确的(第 10 个月(11 月)没有 31 day_of_month)并且 12 月 1 日在 JCalendar 中被选中。我希望 11 月 30 日在这里被选中。
问题是 propertyChangeListener 被调用了两次。假设我的日期是 12 月 31 日,我将其设置为 11 月 30 日。第一次,日期更改为 12 月 30 日(进入我认为的 11 月范围),第二次将日期更改为 11 月 30 日。如果我只打印 evt.getNewValue() 但如果我尝试通过调用其他方法来设置日期,它只会在 12 月 30 日卡住!