当前位置: 首页 > 知识库问答 >
问题:

JDatePicker使用Date中的值设置时增加1个月

邓深
2023-03-14

我在我的应用程序中发现了一个奇怪的错误,每次我在JDatePicker上设置时,它都会比我希望设置的日期增加一个月。。更具体地说,我发现这个错误的原因是LocalDate对象月份与日期不一样?我知道这听起来很奇怪,但这确实是问题的原因。

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个答案

司空玮
2023-03-14

这是因为java.util.Date一月视为月0。因此,如果将1设置为datePicker.getModel(),它将被评估为二月。这是java.utildate-time API的主要设计错误之一。另一方面,java.time.LocalDate一月视为月1(这似乎很自然)。

您的问题的解决方案是从LocalDate中获得的月份减去1,然后将其设置为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及其格式化API,SimpleDateFormal已经过时且容易出错(您刚刚体验过一个!),建议完全停止使用它们,并切换到现代日期-时间API。

  • 无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用Three-Ten Backport,它可以对大部分Java进行Backport。Java 6的时间功能

从Trail: Date Time了解现代日期时间API。

 类似资料:
  • 导出const ProductCard=({product})=>{const{deleteProduct,addToCart}=useContext(ProductContext) }

  • 我正在尝试使用JDatePicker来显示日历。然而,我只想显示月份和年份,而不是日期。 我试着四处寻找模型和JDatePickerImpl对象,但没有运气。 以下是我必须向JDatePicker展示的代码,来自文档: 提前谢谢! 注意:这是我的意思的图像。

  • 问题内容: 我正在运行MySql Server 5.7.11,这句话: 是 不是 工作。给出错误: 但是以下内容: 正常工作 。 DATE的情况相同。 作为 附带说明 ,它在MySQL文档中有所提及: DATE类型用于具有日期部分但没有时间部分的值。MySQL检索并以’YYYY-MM-DD’格式显示DATE值。支持的范围是“ 1000-01-01”至“ 9999-12-31”。 即使他们也说: 无

  • 设置FullCalendar加载的时候,初始化的day-of-month(就是初始化月份中的某一天),值为整数类型。 date只对周视图和天视图有效,月视图不需要这个属性,因为月视图会从头到尾显示整个月。 如果date未设置,month和year设置成当前月和当前年,则当前是几号,FullCalendar就从几号开始。如果date未设置,month和year没有设置为当前年和当前月。FullCal

  • 问题内容: 我的开发机器上有8GB RAM,并试图运行Apache Tomcat(7.0.29)同时托管Artifactory(2.6.3)和Jenkins(1.479)。我试图找到Jenkins的内存需求,但看起来他们的Wiki断了。 在中,我添加了以下命令: 这应该将Tomcat的JVM的大小保持在(基本上)1到3 GB之间,为我留出足够的空间来容纳其他内容, 并 为Tomcat留出足够的内存

  • 问题内容: 在React中,我试图使按钮增加一个状态存储的值。但是,使用下面的代码使用handleClick时,我的值设置为undefined或NaN。 你能告诉我为什么会这样吗?根据此处的文档,它应该是正确的:https : //facebook.github.io/react/docs/state-and- lifecycle.html 问题答案: 因为您使用的handleClick函数不正确