找到两个日期之间的差异,日期存储在字符串类型中

时间:2013-03-20 06:50:02

标签: java

我已经在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)

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

1 个答案:

答案 0 :(得分:1)

首先,我会尽可能地提出使用Joda Time的正常建议。内置的日期/时间API 可怕,很容易与之混淆。

其次,如果可能,请避免字符串表示。您在要求中没有说出任何内容表明您需要字符串表示 - 所以不要创建一个。通常,尽早将字符串表示转换为更合理的表示,并尽可能晚地将转换为字符串表示。坚持LocalDateDateTime等(甚至DateCalendar)尽可能多的时间将为您提供更丰富的API。

现在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 one)的问题。在这种特殊情况下,它可能有点过分,但只需要处理所有业务逻辑的一个表示,这有助于简化操作。

我还建议将日期选择器的时区设置为UTC,假设您只选择日期 - 如果您使用UTC进行所有围绕此进行的转换,它将使根据代码运行的位置,更容易避免出现问题。

相关问题