我在我的应用程序中发现了一个奇怪的错误,每次我在JDatePicker上设置时,它都会在我希望设置的日期后增加+1个月。。更具体地说,我发现这个错误的原因是LocalDate对象月份与Dates对象月份不一样?我知道这听起来很奇怪,但这确实是问题的原因。
currentlyChanging.getDate() <- returns LocalDate
datePicker.getModel().setDate(currentlyChanging.getDate().getYear(),
currentlyChanging.getDate().getMonth().getValue(),
currentlyChanging.getDate().getDayOfMonth());
上面的代码将日期选择器设置为2020-11-15
,而不是2020-10-15
(因此它增加了+1个月(。经过进一步的调查,我注意到当我将此LocalDate转换为Date时,一切都开始正常工作,尽管。。。有个问题。。。IntelliJ告诉我,getMonth方法已被弃用,如果只是在这个小用例中,我不确定使用它是否安全。
Date aaa = Helper.convertToDateViaSqlDate(currentlyChanging.getDate());
datePicker.getModel().setDate(currentlyChanging.getDate().getYear(),
aaa.getMonth(),
currentlyChanging.getDate().getDayOfMonth());
---[helping method]---
public static Date convertToDateViaSqlDate(LocalDate dateToConvert) {
return java.util.Date.from(dateToConvert.atStartOfDay()
.atZone(ZoneId.systemDefault())
.toInstant());
}
我到处搜索了一下,得到我需要的Month的最好方法是使用LocalDate,但这是在我的实现中添加+1个月,并执行"-1〃;在我看来就像。。。怎么说。。。。不是一个好的解决方案:D
有人能告诉我为什么这个错误会首先发生吗?同时,如果有可能在不使用";getMonth"日期,因为该方法已被弃用?提前感谢:(
这是因为java.util.Date
将January
视为月0
。因此,如果将1
设置为datePicker.getModel()
,则它将被评估为February
。这是java.util
日期时间API的主要设计错误之一。另一方面,java.time.LocalDate
认为January
是月1
(这似乎是自然的(。
解决问题的方法是用1
减去从LocalDate
中获得的月份,然后将其设置为datePicker.getModel()
,即
datePicker.getModel().setDate(currentlyChanging.getDate().getYear(),
currentlyChanging.getDate().getMonth().getValue() - 1,
currentlyChanging.getDate().getDayOfMonth());
下面是您的问题的快速演示:
import java.time.LocalDate;
import java.util.Calendar;
public class Main {
public static void main(String[] args) {
LocalDate localDate = LocalDate.of(2020, 1, 20);
System.out.println(localDate);
System.out.println(localDate.getMonth());
System.out.println(localDate.getMonthValue());
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, localDate.getYear());
calendar.set(calendar.MONTH, localDate.getMonthValue());
calendar.set(Calendar.DAY_OF_MONTH, localDate.getDayOfMonth());
System.out.println(calendar.getTime());
}
}
输出:
2020-01-20
JANUARY
1
Thu Feb 20 21:14:28 GMT 2020
java.util
的日期时间API和它们的格式APISimpleDateFormat
已经过时并且是错误的(您刚刚经历过一次!(。建议完全停止使用它们,并切换到现代日期时间API。
- 无论出于何种原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen Backport将Java.time的大部分功能向后移植到Java 6&7
- 如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API
从跟踪:日期时间了解现代日期时间API。