我在我的应用程序中发现了一个奇怪的错误,每次我在jdatepicker上做一个设置,它都会在我想要设置的日期前增加+1个月。。更具体地说,我发现这个bug的原因是localdate对象months与dates one不一样?我知道这听起来很奇怪,但这确实是问题的根源。
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());
}
我已经到处搜索过了,得到我需要的月份的最好方法是使用localdate,但是这个方法是在我的实现中添加+1个月,并且在我看来“-1”就像一个。。。怎么说。。。。不是个好办法:d
有人能告诉我为什么这个错误会在第一时间发生,同时,如果有可能修复它不使用“getmonth”的日期,因为这个方法是不赞成的?提前感谢:)
1条答案
按热度按时间ttisahbt1#
是因为
java.util.Date
考虑January
月份0
. 因此,如果你1
至datePicker.getModel()
,它将被评估为February
. 这是一个主要的设计缺陷java.util
日期时间api。另一方面,java.time.LocalDate
考虑January
月份1
(这似乎很自然)。你的问题的解决办法是从中扣除月份
LocalDate
由1
然后设置为datePicker.getModel()
即下面是您问题的快速演示:
输出:
api的日期时间
java.util
以及它们的格式化api,SimpleDateFormat
过时而且容易出错(你刚刚经历过一次!)。建议完全停止使用它们,并切换到现代日期时间api。出于任何原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。
从trail:date-time了解现代日期时间api。