2017-10-18 21 views
0

私は、タイムゾーンの異なる端末からアクセスできるWebポータルからクロックの入出力機能を使用しています。Spring JDBC Persist ZonedDateTime

私はZonedDateTimeを使用して、特定のパンチイン/アウトレコードの日時の計算を処理しています。

// Get store timezone 
ZoneId storeTimeZone = this.storeService.getStoreZoneId(storeNum); 

// Get current store time to use for punch in/out timestamp 
ZonedDateTime currentStoreTime = ZonedDateTime.ofInstant(Instant.now(), storeTimeZone); 

データをOracle 11gに保存すると、ZonedDateTimeオブジェクトを永続化できません。 JDBCドライバでサポートされていない可能性があります。その企業環境では、データベースとドライバは変更されません。

NamedParameterJdbcTemplateに渡すMapSqlParamSourceをビルドするときに、java.sql.Timestampに変換する必要がありますが、ゾーンデータを失い、サーバーが存在するタイムゾーンのタイムスタンプを保存すると、要件が規定されますOracle TIMESTAMP列であるデータベースに格納する必要があります。

params.addValue("clockInTimestamp", Timestamp.from(prevRecord.getTimeEntryTimestamp().toInstant()), Types.TIMESTAMP); 

この永続ZonedDateTimeを達成する方法はありますか?

+0

Spring、JDBCなどの詳細を忘れると、インスタント+タイムゾーンをインスタントのみを格納できるフィールドに保存しようとしているように思えます。それで、 "I 4バイトのフィールドに32バイトのデータを格納したい "とします。どのような情報をどのように保存したいのか、そしてどのようにして情報を達成するのかを考えることをお勧めします。 –

答えて

1

Sprint Bootプロジェクトは自動的にjsr310jpaconvertersをロードしますが、これはLocalDateTimeタイプの変換のみを処理し、ZonedDateTimeでは処理しません。 Springブートを使用していない場合は、これらの追加コンバータを自分でロードすることができます。

アプリケーションをデータベースの対話レベルで使用し、保存したすべてのものを1つの標準時間帯に強制して、ユーザーの表示目的に応じて簡単にZonedDateTimeに変換することができます。

0

私はこの問題をZonedDateTimeからInstantに変換し、タイムゾーンオフセットを使用して手動でタイムスタンプを計算することでこの問題を解決できました。以下

例コード:

ZonedDateTime timeEntry = ZonedDateTime.now(); 

ZoneOffset storeOffset = timeEntry.getOffset(); 
ZoneOffset serverOffset = ZonedDateTime.now().getOffset(); 

int secondsOffset = storeOffset.getTotalSeconds() - serverOffset.getTotalSeconds(); 

Instant entryTimestamp = timeEntry.toInstant().plusSeconds(secondsOffset); 

Timestamp ts = Timestamp.from(entryTimestamp); 

そして、私は、データベースにたjava.sql.Timestampを永続。

私は確かに最善の解決策ではありませんが、データベース、ドライバ、その他の方法を変更できないという制約があると、うまくいくようです。

関連する問題