1

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 回変換する必要があるためです。

この問題の解決を手伝ってください

4

1 に答える 1

5

Java の日付にはタイム ゾーンがありません。それらはただの普遍的な瞬間です。特定のタイム ゾーンで日付を表示する場合は、このタイム ゾーンで初期化された DateFormat を使用します。

DateFormat df = DateFormat.getInstance();
df.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("The date in the database, in the UTC time zone, is " 
                   + df.format(date));

何も変換する必要はありません。日付形式は、書式設定するユニバーサル インスタントと、使用するように指定したタイム ゾーンに基づいて、適切な値を出力します。

同様に、日付が月曜なのか火曜なのか、1 時なのか 2 時なのかを知りたい場合は、まずタイム ゾーンを選択し、Calendar に変換して、カレンダーに情報:

Calendar cal = Calendar.getInstance(someTimeZone);
cal.setTime(date);
System.out.println("The day for the date stored in the database, for the time zone "
                   + someTimeZone
                   + " is " + cal.get(Calendar.DATE));

補足: 非推奨のメソッドは使用しないでください。それらは正当な理由で非推奨です。

于 2012-07-30T18:06:52.637 に答える