2016-11-11 5 views
1

DBに日付を保存しようとしていますが、以下のエラーが表示されます。Java:日付値をデータベースに保存中にエラーが発生しました(Simpledataformat)

java.lang.IllegalArgumentExceptionが::タイムスタンプ形式は YYYY-MM-DD HHでなければなりません:MM:SS [.fffffffff]

私は同じフォーマットを送信するが、まだ例外をスローしていますので、私は混乱しています私は以下のように SQL Developerのにしようとしていた場合

は、それは私が

次のようにやってみましたJavaを通じて

to_date('01/01/1900', 'mm/dd/yyyy') 

正常に動作します0

まずメソッド

SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
Date myDate = format1.parse("01/01/1900 00:00:00"); 

第2の方法私が間違っているつもりです

SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy"); 
Date myDate = format1.parse("01/01/1900"); 

P.S:重複しているとマークして、質問に回答できないようにしてください。私は何か試してエラーを起こしたことを理解してください。

+0

実際にSQLに書き込もうとしているコード部分を表示することができます – alainlompo

+0

@alainlompo:row = new STRUCT(myNewRon、getConnection()、attributes); – sTg

答えて

1

日付パターンが一致しません。

PreparedStatementを使用すると、決して文字列変換に頼ることはありません。

2

TL; DR

myPreparedStatement.setObject(
    … , 
    LocalDate.parse( 
     "01/01/1900" , 
     DateTimeFormatter.ofPattern("dd/MM/uuuu") 
    ) 
) 

詳細

Answer by Just another Java programmerが正しいです。

さらに、文字列を使用して日付時刻の値をデータベースと通信しないでください。日時クラスを使用します。

最新の方法は、面倒なレガシー日時クラスに取って代わるjava.timeクラスです。

LocalDate

LocalDateクラスは、時間日の時間帯なしなし日付専用の値を表しています。

タイムゾーンは、日付を決定する際に重要です。任意の瞬間について、日付は地球の周りでゾーンごとに異なります。たとえば、Paris Franceの真夜中の数分後には、新しい日がありますが、まだ「昨日」はMontréal Québecです。

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

標準ISO 8601形式の文字列から直接解析することができます。

LocalDate localDate = LocalDate.parse("2016-01-23"); 

または各部分を指定します。

LocalDate localDate = LocalDate.of(2016, Month.JANUARY , 23); 

他の形式を解析するには、DateTimeFormatterクラスを使用します。多くの例でスタックオーバーフローを検索します。あなたのJDBC driverJDBC 4.2以降に準拠している場合

データベース

PreparedStatement::setObjectとjava.timeタイプを渡すとResultSet::getObjectをフェッチすることができるはずです。

myPreparedStatement.setObject(… , localDate); 

...か...

myPreparedStatement.setObject(… , localDate , JDBCType.DATE); 

をあなたのドライバーはそれほど有効でない場合は、java.sql.Dateを使用してにフォールバック。この厄介なクラスは、日付のみの値を表すふりをします(実際には、無視するはずの真夜中に設定された時間コンポーネントを持っています)。 java.timeに/からjava.timeに変換するには、古いクラスに追加された新しいメソッドを探します。

java.sql.Date sqlDate = java.sql.Date.valueOf(localDate); 

他の方向に進みます。

LocalDate localDate = sqlDate.toLocalDate(); 

PreparedStatement::setDateに渡す。

myPreparedStatement.setDate(… , sqlDate); 

java.timeについて

java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.DateCalendar、& SimpleDateFormatなど、面倒な古いlegacy日時クラスに取って代わります。

Joda-Timeプロジェクトは、今maintenance modeで、java.timeへの移行をアドバイスします。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
    • ThreeTenABPプロジェクトはThreeTen-バックポート具体的にAndroidのため(上記)を適応させます。
    • How to use…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

関連する問題