-1

我在 java 中做了一个应用程序,其中我有“从日期”和“到日期”的表单。我想检查从“To date”中选择的日期是否在“From date”之后 示例:如果从“From date”中选择的日期是 2013-03-18(YY-mm-dd) 那么选择的日期是“迄今为止”应该是 2013-03-18 之后/之后的任何日期。要获取我使用 JXDatePicker 的日期,并将日期转换为我使用的 yy-mm-dd 格式, SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy/MM/dd") 我需要这个来验证,所以如果“To date”是>“From date”,那么它应该显示 JOptionPane错误信息。

编辑>我尝试从 JXDatePicker 中获取日期

Date fd = (Date) from.getDate();

这是在从 JXDatePicker 选择日期时执行的,我也尝试过打印日期,但是当我运行应用程序时出现如下错误:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
    at rejectionCategorisedReport$1.actionPerformed(rejectionCategorisedReport.java:154)
    at org.jdesktop.swingx.JXDatePicker.fireActionPerformed(JXDatePicker.java:916)
    at org.jdesktop.swingx.JXDatePicker.commitEdit(JXDatePicker.java:706)
    at org.jdesktop.swingx.plaf.basic.BasicDatePickerUI.commit(BasicDatePickerUI.java:859)
    at org.jdesktop.swingx.plaf.basic.BasicDatePickerUI$Handler.monthViewActionPerformed(BasicDatePickerUI.java:1327)
    at org.jdesktop.swingx.plaf.basic.BasicDatePickerUI$Handler.actionPerformed(BasicDatePickerUI.java:1302)
    at org.jdesktop.swingx.JXMonthView.fireActionPerformed(JXMonthView.java:1788)
    at org.jdesktop.swingx.JXMonthView.commitSelection(JXMonthView.java:1686)
    at org.jdesktop.swingx.plaf.basic.BasicMonthViewUI$Handler.mouseReleased(BasicMonthViewUI.java:2053)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

有人可以帮助我并告诉我问题是什么吗?

4

1 回答 1

1

首先,我会给出尽可能使用Joda Time的常规建议。内置的日期/时间 API 很糟糕,很容易混淆。

其次,尽可能避免使用字符串表示。您在要求中所说的任何内容都表明您需要字符串表示 - 所以不要创建一个。一般来说,尽可能早地将字符串表示转换为更合理的表示,并尽可能晚地转换字符串表示尽可能多地坚持使用LocalDate,DateTime等(或什Date至 and )将为您提供更丰富的 API 来使用。Calendar

现在 Luiggi 说Datebeforeafter方法是对的,所以你可以使用:

Date fromDate = fromPicker.getDate();
Date toDate = toPicker.getDate();
if (toDate.before(fromDate)) {
    // Show an error message
}

我个人可能会LocalDate尽早转换为(假设这些确实只是日期) - 可能使用您的表单中的方法:

// You'd have methods in your form to convert fromPicker.getDate() to LocalDate
// and likewise toPicker.
LocalDate fromDate = getFromDate();
LocalDate toDate = getToDate();
if (toDate.isBefore(fromDate)) {
    // Show an error message
}

...再一次,这是尽早获得首选代表(Joda Time 代表)的问题。在这种特殊情况下,这可以说是矫枉过正,但只需要处理所有业务逻辑的一种表示有助于保持简单。

我还建议将日期选择器的时区设置为 UTC,因为您只选择日期 - 如果您使用 UTC 进行围绕此的所有转换,它会更容易避免问题,具体取决于您的代码位置在跑。

于 2013-03-20T07:00:19.420 回答