2017-10-24 7 views
0

setDateのパラメータとして渡されているときに、Java LocalDateを特定の形式に変換する次のコードがあります。javaのsetDateの不正な引数の例外

LocalDate localDate = LocalDate.now(); 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy"); 
String formattedString = localDate.format(formatter); 
storedProcedureCall.setDate(1, java.sql.Date.valueOf(formattedString)); 

は、しかし、それは常に私が行うとき、私はsetDateの引数でformattedString含めるとIllegalArgumentException投げるが、正常に動作します:一般的に

storedProcedureCall.setDate(2, java.sql.Date.valueOf(java.time.LocalDate.now())); 

storedProcedureCall.setDate(2, java.sql.Date.valueOf(java.time.LocalDate.now())); // working 

storedProcedureCall.setDate(2, java.sql.Date.valueOf(formattedString)); // not working 
+3

[Javadocの]から( https://docs.oracle.com/javase/7/docs/api/java/sql/Date.html#valueOf(java.lang.String)): "例外: ' IllegalArgumentException' - if指定された日付はJDBCの日付エスケープ形式(yyyy- [m] m- [d] d)ではありません " –

+0

調査の証拠がないので、私はこの質問をd​​ownvotedしました。あなたの質問を編集して、あなたが行った研究と難しいところを正確に*含めるようにしてください。あなたがこれを行うことができれば、私は私のdownvoteを撤回するかもしれません。 –

+0

現在の日付を保存する必要がある場合は、 'java.sql.Date.valueOf(LocalDate.now())'を使用してください。 'setDate'メソッドは' Date'をパラメータとし、日付オブジェクトは**フォーマットなし**です(https://codeblog.jonskeet.uk/2017/04/23/all-about-java-util-日付)。後でこの値を別の形式で*表示する場合は、 'DateTimeFormatter'の' format'メソッドを使って 'Date'を' String'に変換します。 –

答えて

0
LocalDate localDate = LocalDate.now(); 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy"); 
String formattedString = localDate.format(formatter); 
LocalDateTime ldt = LocalDateTime.from(LocalDate.parse(formattedString, formatter).atStartOfDay()); 
storedProcedureCall.setDate(1, Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant())); 

このうまくいくはずです。しかし、java.util.Dateを使用し、LocalDateのような新しいクラスを使用しない標準ライブラリで作業する場合は、old Javaクラスを使用する方が快適です。

ご理解のとおり、現在の日付はstoredProcedureCallに設定されています。 Javaでは、任意の日付はlongです。それをStringに変換するまでは、ローカルやその他の機能については心配しないでください。ですから、問題を1行で解決することができます:

storedProcedureCall.setDate(1, new java.util.Date()); 

P.S. 24 oct 2017Dateにインスタンスを変換し、storedProcedureCallに設定する方法

storedProcedureCall.setDate(1, new SimpleDateFormat("dd MMM yyyy", Locale.US).parse("24 oct 2017")); 
+0

ya現在の日付をstoredProcedureCallに設定しますが、フォーマットは "dd MMM yyyy"です。フォーマットが主な目的でなければ、これはjava.sql.Date.valueOf(java.time.LocalDate.now())で簡単に動作します – Aby

+1

これで、 'java.sql.Date.valueOf()' 'Date'を生成し、' String'を生成しません。 'Date'ではなく' String'を使うときだけ、日付フォーマットについて話すことができます。テーブルの列に 'Date'形式がある場合、' Date' isntanceを設定するだけで、文字列の日付形式には依存しません。 –

+0

それでは、私はformattedString(24 octet 2017)文字列型をstoredProcedureCall.setDate(3、java.sql.Date.valueOf(formattedString))のDate型に変換できます。 – Aby

-1

あなたのコードは、そのようにする必要があり

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 

この形式を使用します。

LocalDate localDate = LocalDate.now(); 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 
    String formattedString = localDate.format(formatter); 
    storedProcedureCall.setDate(1, java.sql.Date.valueOf(formattedString)); 
+0

日付が必要です( "dd MMM yyyy")。現在、あなたが書いたのと同じコードを使用しています。 – Aby

+0

解析対象の日付文字列は、 "yyyy-MM-dd"の形式にする必要があります。なぜこの形式が必要ですか? –

+0

フォーマットの変更を保存するには、ストアドプロシージャで日付の代わりに文字列を使用するか、日付をフォーマットするようにストアドプロシージャを設定します。 –

関連する問題