-1

「日付から」と「日付まで」のフォームがあるJavaでアプリケーションを作成しました。「終了日」で選択した日付が「開始日」よりも後の日付かどうかを確認したい例:「開始日」で選択した日付が2013-03-18(YY-mm-dd)の場合、「開始日」で選択した日付は「To date」は、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、よりリッチな API を使用できます。DateTimeDateCalendar

LuiggiがとメソッドをDate持っていると言っているのは正しいので、次のように使用できます。beforeafter

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 のもの) に到達することの問題です。この特定のシナリオでは間違いなくやり過ぎですが、すべてのビジネス ロジックを1 つの表現で処理するだけで済むため、物事をシンプルに保つことができます。

また、日付のみを選択していることを考えると、日付ピッカーのタイムゾーンを UTC に設定することをお勧めします。これに関するすべての変換に UTC を使用すると、コードの場所に応じて問題を回避しやすくなります。が走っています。

于 2013-03-20T07:00:19.420 に答える