JDatePicker在使用Date中的值设置时添加+1个月



我在我的应用程序中发现了一个奇怪的错误,每次我在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.DateJanuary视为月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 BackportJava.time的大部分功能向后移植到Java 6&7
  • 如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API

跟踪:日期时间了解现代日期时间API。

相关内容

  • 没有找到相关文章

最新更新