jdatepicker在设置值from date时添加+1个月

to94eoyn  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(294)

我在我的应用程序中发现了一个奇怪的错误,每次我在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”的日期,因为这个方法是不赞成的?提前感谢:)

ttisahbt

ttisahbt1#

是因为 java.util.Date 考虑 January 月份 0 . 因此,如果你 1datePicker.getModel() ,它将被评估为 February . 这是一个主要的设计缺陷 java.util 日期时间api。另一方面, java.time.LocalDate 考虑 January 月份 1 (这似乎很自然)。
你的问题的解决办法是从中扣除月份 LocalDate1 然后设置为 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

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。

相关问题