我已经在java中创建了一个应用程序,我的表单中有“From date”& “至今”。
我想检查“截止日期”之后所选日期是否在“起始日期”之后
示例:如果从“起始日期”中选择的日期是2013-03-18(YY-mm-dd),那么从“到目前”中选择的日期应该是/大于2013-03-18之后的任何日期。要获取我使用过JXDatePicker的日期,并使用yy-mm-dd格式转换日期我使用过
SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy/MM/dd")
我需要这个来验证,所以如果“To 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)
有人可以帮助我并告诉我问题是什么吗?
答案 0 :(得分:1)
首先,我会尽可能地提出使用Joda Time的正常建议。内置的日期/时间API 可怕,很容易与之混淆。
其次,如果可能,请避免字符串表示。您在要求中没有说出任何内容表明您需要字符串表示 - 所以不要创建一个。通常,尽早将从字符串表示转换为更合理的表示,并尽可能晚地将转换为字符串表示。坚持LocalDate
,DateTime
等(甚至Date
和Calendar
)尽可能多的时间将为您提供更丰富的API。
现在Luiggi说Date
有before
和after
方法,所以你可以使用:
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 one)的问题。在这种特殊情况下,它可能有点过分,但只需要处理所有业务逻辑的一个表示,这有助于简化操作。
我还建议将日期选择器的时区设置为UTC,假设您只选择日期 - 如果您使用UTC进行所有围绕此进行的转换,它将使根据代码运行的位置,更容易避免出现问题。