Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找两个日期之间的差异,日期以字符串类型存储_Java - Fatal编程技术网

Java 查找两个日期之间的差异,日期以字符串类型存储

Java 查找两个日期之间的差异,日期以字符串类型存储,java,Java,我用java编写了一个应用程序,其中的表单有“From date”和“To date”。 我想检查所选的“开始日期”是否在“开始日期”之后 示例:如果从“开始日期”中选择的日期为2013-03-18(YY-mm-dd),则从“结束日期”中选择的日期应为2013-03-18之后/之后的任何日期。为了获取我使用JXDatePicker的日期,并将日期转换为我使用的yy-mm-dd格式 SimpleDataFormat formatter1=新的SimpleDataFormat(“yyyy/MM/dd

我用java编写了一个应用程序,其中的表单有“From date”和“To date”。 我想检查所选的“开始日期”是否在“开始日期”之后 示例:如果从“开始日期”中选择的日期为2013-03-18(YY-mm-dd),则从“结束日期”中选择的日期应为2013-03-18之后/之后的任何日期。为了获取我使用JXDatePicker的日期,并将日期转换为我使用的yy-mm-dd格式
SimpleDataFormat formatter1=新的SimpleDataFormat(“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)

有人能帮我一下,告诉我问题出在哪里吗?

首先,我会给出我的正常建议,尽可能地使用。内置的日期/时间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进行所有转换,则根据代码运行的位置,可以更轻松地避免问题。

您的方法是currect!和。选择您最喜欢的并开始。为什么要转换为字符串表示形式?为什么您希望格式为“yyy/MM/dd”的
SimpleDateFormat
会给您一个格式为“yy-MM-dd”?现在还不清楚你为什么要使用字符串格式。那么你是要求我们提供完整的代码还是什么?我不认为这是重复的-OP没有字符串,他有一个
JXDatePicker
。问题的一部分(IMO)是他在没有理由的情况下想到了字符串。现在我觉得如果我在代码中做了很多更改,那么它们对我来说就是问题。所以,我想要解决现有问题的方法,我想以字符串格式与日期进行比较,并检查其中一个日期是否更大。@Mayur:为什么?有什么可能的好处?您可以看到以“本机”表示比较日期是多么简单-以字符串形式比较日期会更复杂。。。而且,您将使代码更加远离“好”代码,因为“好”代码只在需要时使用字符串。你做得越多,你修复它的可能性就越小。您的问题描述中绝对没有任何内容表明需要使用字符串。我将尝试您告诉我在代码中实现的内容,但请告诉我应该在数据库中进行哪些更改。我使用mysql数据库将日期存储在字符串类型amd中。我必须更改Date或datetime中的类型??我的代码中的日期如下。”to.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){toDate=formatter.format(to.getDate());System.out.println(toDate);}}}@Mayur:您不必更改数据库格式,但我强烈建议您这样做。你的数据根本不是文本数据,那么你为什么要这样对待它呢?坦率地说,日期和时间无论如何都很难处理,不会增加不必要转换的额外复杂性。这是一个你必须维护的真实项目,还是仅仅是一个学校项目?因为如果它是一个真正的项目,那么你应该权衡花费更多时间立即获得它的前期成本,以及在获得生产数据后修复它的难度。