2017-01-25 4 views
0

私のプロジェクトでは、新しいDate();他の言語で日付を与える。そして、それはエラーを与えている、誰かが英語でダーツを変換するためのソリューションを提供できますか?日付はJavaの非英語OSで来る

私のコードは以下の通りです:

model.put("total", timeSheetTempDAO.getCurrentDayHours(SessionManagement.getCurrentUserId(),new SimpleDateFormat("YYYY-MMM-dd").format(new Date()))); 

org.postgresql.util.PSQLException: ERROR: invalid input syntax for type date: "२०१७-जनवरी-२६" Position: 136 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103) org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836) org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512) org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388) org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273) org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:56) org.hibernate.loader.Loader.getResultSet(Loader.java:2040) org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1837) org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1816) org.hibernate.loader.Loader.doQuery(Loader.java:900) org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342) org.hibernate.loader.Loader.doList(Loader.java:2526) org.hibernate.loader.Loader.doList(Loader.java:2512) org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2342) org.hibernate.loader.Loader.list(Loader.java:2337) org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:495) org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:357) org.hibernate.engine.

+2

あなたの2番目の引数に適切な[Locale](https://docs.oracle.com/javase/8/docs/api/java/util/Locale.html)を設定する必要があるように見えます'SimpleDateFormat'コンストラクタです。 –

答えて

1

TL; DR

  • が使用するyyyy-MM-dd
  • より良い、あなたの書式設定のパターンを修正し、あなたのSimpleDateFormat
  • ためLocaleを指定しますthの代わりにjava.timeクラス文字列で面倒なレガシークラス

現在の日付をESE:

LocalDate.now( 
    ZoneId.of("America/Montreal") 
).toString() 

はあなたのコードを簡素化

をデバッグするとき、この種の問題をデバッグするために、あなたのコードを引き裂きます。長い複雑なコード行を1つ表示します。ひとたび分離されると、問題はPostgresやJDBC/Hibernateと何の関係もないことがわかります。

あなたはSimpleDateFormatのために間違ったフォーマットのコードを使用している

不正なフォーマットのパターン。大文字のYは、暦年ではなく週単位を意味します。トリプルMは月の名前であり、数字ではありません。 SimpleDateFormatの場合はyyyy-MM-ddを使用します(実際にはjava.timeクラスを使用する必要があります)。

パスオブジェクトではなく、文字列は、JDBC

を使用してデータベースにJDBCて、文字列として日時値を渡さないでください。日時型を使用します。 JDBCの目的の1つは、データベースのJava型とデータ型の違いを埋めることです。詳細については、「JDBC」および「LocalDate」の検索スタックオーバーフローを参照してください。

タイムゾーン

タイムゾーンの問題は無視しています。

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

SimpleDateFormatクラスは、JVMの現在のデフォルトタイムゾーンを暗黙的に適用します。したがって、結果は異なる場合があります。常に望ましい/予想されるタイムゾーンを明示的に指定する方がよいでしょう。

ロケール

あなたの日付時刻値を表す文字列を生成するとき同様に、あなたはLocaleの問題を無視しています。 Localeは、(a)日の名前、月の名前などの翻訳のための人間言語、および(b)略語、大文字、句読点などの問題を決定する文化的規範を決定する。ロケールにははありません。ちなみに、タイムゾーンとは何かです。

クラスは、JVMの現在のデフォルトのLocaleを暗黙的に使用します。常に望ましい/予想されるロケールを明示的に指定する方がよいでしょう。おそらくLocale.UKまたはLocale.ENGLISHです。

java.time

あなたは面倒な古い日時クラスを使用しています。私は、Hibernateのjava.timeのサポートについてはわかりませんが、java.timeクラスについて学び、それらの使用を検討することをお勧めします。

LocalDate

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

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

java.timeについて

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

maintenance modeにあるJoda-Timeプロジェクトは、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
    • プロジェクトは、具体的にはAndroid用(上記)ThreeTen-バックポートを適応させます。
    • How to use ThreeTenABP…を参照してください。

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

+0

完全なソリューション、 "" yyyy-MM-dd "、Locale.ENGLISH'。ありがとうございました。 –

関連する問題