DB(Sql Server)のテーブルの列の1つに保存されている時間を指定されたタイムゾーンに変換するタスクがあります。列には常に UTC タイムゾーンの時間が含まれます。
私が直面している問題は、hibernateが列を読み取り、それをエンティティ クラスに設定すると、アプリケーション サーバーのタイムゾーンに時刻が設定されることです。
例: DB の値が 2012 年 7 月 7 日 10:30 (実際には UTC) の場合、休止状態はマップされた日付フィールドを 2012 年 7 月 7 日 10:30 PST に設定します (JVM が PST で実行されていると仮定)。
この日付が他のタイムゾーンに変換されると.. GMT + 5:30と言うと、予期しない結果が得られます
上記の問題を修正するには...次のコードを書きました
//Reading the DB time (which does not have timezone info)
Date dbDate = entityObj.getDBUtcDate();
//Setting GMT timezone to the date, without modifying the date
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
c.set(dbDate.getYear(), dbDate.getMonth(), dbDate.getDate()..., dbDate.getMinutes());
Date utcDate = c.getTime();
上記のコードを使用して..DBに保存された日付をUTCタイムゾーンに戻すことができましたが、以下のロジックを使用して他のタイムゾーン(GMT + 5:30など)に変換したときに
Calendar outCal = Calendar.getInstance(TimeZone.getTimeZone("GMT+5:30"));
outCal.setTimeInMillis(utcDate.getTime());
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, outCal.get(Calendar.YEAR));
cal.set(Calendar.MONTH, outCal.get(Calendar.MONTH));
cal.set(Calendar.DAY_OF_MONTH, outCal.get(Calendar.DAY_OF_MONTH));
cal.set(Calendar.HOUR_OF_DAY, outCal.get(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, outCal.get(Calendar.MINUTE));
cal.set(Calendar.SECOND, outCal.get(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, outCal.get(Calendar.MILLISECOND));
//Converted date
Date pstTime = cal.getTime();
//Converted time mill seconds
long timeMilSec = pstTime.getTime();
変換された日付の時間ミリ秒が負の値 (-54672...) になり始めましたが、これは無効な時間を表しているようです。
ここでの私の質問は、DB からタイムゾーン情報を復元するにはどうすればよいですか (具体的にタイムゾーン情報を格納するために DB に余分な列を持たなくてもよい)?
また
DB時間を指定されたタイムゾーン(UTC)の時間に変換するにはどうすればよいですか?
PS: 出力は java.util.Date/ Calendar の形式であると予想されます。この日付でもう 1 回変換する必要があるためです。
この問題の解決を手伝ってください