38

名前付き SQL パラメータに日付を割り当てると、Hibernate は自動的にそれを GMT 時間に変換します。すべての日付に現在のサーバーのタイムゾーンを使用するにはどうすればよいですか?

クエリがあるとしましょう:

Query q = session.createQuery("from Table where date_field < :now");
q.setDate("now", new java.util.Date());

「now」は GMT 時間に設定され、「new Date()」は現在のサーバー時間を取得します。

ありがとう。

4

5 に答える 5

68

Hibernateは日付をGMTに自動的に変換しないことが判明したquery.setDate()ため、を使用すると時刻が切り捨てられるだけなので、「2009-01-16 12:13:14」を渡すと、「2009-01-1600:00」になります。 :00"。

時間を考慮に入れるには、query.setTimestamp("date", dateObj)代わりに使用する必要があります。

于 2009-01-16T21:45:10.867 に答える
2

timeZone同期値が必要な場合は、HQL でnow()を使用できます。また、Joda ライブラリを使用することをお勧めします。hibernate-plugin モジュールがあります。

于 2011-11-17T10:11:25.057 に答える
2

カスタムの Hibernate 日付型を使用します。クエリにパラメーターを設定するときはいつでも、基本クラスまたはユーティリティ メソッドを使用して、ユーザーのタイムゾーンをカスタム型パラメーターに渡すことができます。

クエリのユーティリティ メソッドで時刻を手動で調整するだけで済みますが、この方法では、データベースに読み書きされる日付も正しく変換されます。このメソッドは、データベースが日付をローカル タイム ゾーンで格納する状況にも対応します。したがって、ユーザーが 1 つのタイム ゾーンにいて、データベース サーバーが別のタイム ゾーンにあり、Java が GMT を使用している場合でも、すべてを正しく処理できます。最終的には次のようになります。

Properties properties = new Properties();
properties.setProperty("timeZone", databaseTimeZone);
query.setParameter("from", dateEnteredByUser, Hibernate.custom(LocalizedDateType.class, properties));

おまけとして、これを使用して、SQL Server が 23:59:59.999 を翌日に変換するという事実に対処します。カスタムタイプでは、それをチェックして元に戻します。

于 2008-11-15T01:42:04.533 に答える
2

Hibernate はタイムゾーンを認識しません。タイムゾーンの変換は、クエリを実行する前に行う必要があります。

たとえば、データベース サーバーが CST に設定されていて、ユーザーが EST を使用している場合、クエリへの入力であるタイムスタンプに 1 時間を追加する必要があります。

于 2008-11-14T22:27:18.497 に答える