2016-11-25 4 views
0

私は現在ローカルマシン上でホストされているMariaDBを使用しているOSX上でSpring JPA Webアプリケーションを開発しています。 MariaDBでの私のタイムゾーン設定のクエリは以下を示します:Spring JPAでのタイムゾーン調整の問題を回避するにはどうすればよいですか?

MariaDB [testdb]> show variables like '%time_zone%'; 
+------------------+--------+ 
| Variable_name | Value | 
+------------------+--------+ 
| system_time_zone | EST | 
| time_zone  | SYSTEM | 
+------------------+--------+ 
2 rows in set (0.00 sec) 

MariaDB [testdb]> 

私は日付を使用する@Queryを持っています。照会される表には、日付として定義されたフィールドがあります。トレースレベルのログを有効にすると、日付が正しく渡されていることがわかりますが、selectステートメントがアセンブルされるまでに1日ずつ調整されています。これにより明らかに誤った結果が返されます。クエリを手動で実行すると、明らかに目的の行が返されません。未調整の日付で手動でクエリを実行すると、適切な行が返されます。トレースで

2016-11-25 12:11:46 TRACE org.hibernate.type.descriptor.sql.BasicBinder:81 - binding parameter [3] as [DATE] - [2016-11-04] 
2016-11-25 12:29:00 TRACE org.hibernate.loader.Loader:1934 - Bound [4] parameters total 
2016-11-25 12:29:00 TRACE org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl:437 - Registering result set [[email protected]] 
2016-11-25 12:29:00 TRACE org.hibernate.loader.Loader:946 - Processing result set 
2016-11-25 12:29:00 TRACE org.hibernate.loader.Loader:970 - Done processing result set (0 rows) 
2016-11-25 12:29:00 TRACE org.hibernate.loader.Loader:1112 - Total objects hydrated: 0 
2016-11-25 12:29:00 TRACE org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl:412 - Releasing statement [[email protected]: select vacationda0_.EMPLOYEE_ID as EMPLOYEE1_3_, vacationda0_.TYPE as TYPE2_3_, vacationda0_.VACATION_DAY as VACATION3_3_ from VACATION_DAY vacationda0_ where (vacationda0_.EMPLOYEE_ID, vacationda0_.TYPE)=('000448719', 'personal') and vacationda0_.VACATION_DAY='2016-11-03'] 

、私は日付がESTのタイムゾーン用にフォーマットされたときに問題が発生していることがわかります。私は、データベースがアプリケーションと同じTimeZoneを実行している場合は、日付を調整してはならないと思います。明らかに、これは当てはまりません。

誰かがこの問題を解決する方法を提案できますか?

+0

使用し、UTCで時間をシリアライズあります。 – chrylis

答えて

0

問題は、アプリケーションから呼び出すときに、デフォルトのシステム(AWSまたはNTPタイムサーバーを使用している他のクラウドの場合は同期時間)を使用するためです。アプリケーションからタイムゾーンを指定すると、問題が解決されます。

また、Javaの8で、タイムゾーンは常に

LocalDateTime date = Instant 
          .ofEpochMilli(new Date().getTime()).atZone(ZoneId.systemDefault()) 
          .toLocalDateTime(); 
+0

クエリに提供された時間が時間コンポーネントを持たないjava.sql.Dateであるため、これが適用されるかどうかは不明です。残念ながら、タイムゾーンがあります。見た目に矛盾があるようです。 – AixNPanes

+0

java.sql.dateには時刻コンポーネントが含まれていますが、それは取得できません。私は2つのjava.sql.Date変数をチェックしました。どちらも、eclipsの下でデバッグ中に変数ウィンドウに同じ日付を表示しています。しかし、比較に使用されるfastTimeコンポーネントは、1時間で3,600,000だけ異なります。あなたが年、月、日でそれらを比較するとき、彼らは等しいです。 – AixNPanes

関連する問題