我有一个JCalendar
propertyChangeListener,在其中我使用Calendar newValue = (Calendar) evt.getNewValue()
获取新的选定日期。
如果旧日期是31,新选择的月份是30天月份之一,则当我尝试获取newValue.getTime()
的值时,它将返回错误的日期(JCalendar 1.2中旧月份的1和30的30)。 Jcalendar 1.4中的旧月份)。如果我执行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日!
答案 0 :(得分:0)
使用以下方法获取正确的日期和时间
Date c = Calendar.getInstance().getTime();
System.out.println("Current time => " + c);
SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
String formattedDate = df.format(c);
因为Date对象没有时区作为其状态的一部分,所以您需要SimpleDateFormat来格式化和打印所需时区中的日期,请在此处[link](Calendar returns date in wrong time zone)中进行检查