- 私のサーバーは GMT+7 を使用しているため、別の GMT タイムゾーンを持つ別のサーバーに移動すると、データベースに保存されているすべての日付が正しくなくなりますか?
- はい Q1 は正しいです。日付を GMT+0 タイムゾーンで保存し、各メンバーが選択したカスタム GMT タイムゾーンで表示するのはどうですか
- JavaでGMT + 0で日付を取得する方法
5 に答える
1) javadocs から引用すると、Java ミリ秒のタイムスタンプは次のとおりです。
現在時刻と 1970 年 1 月 1 日 UTC 午前 0 時との差 (ミリ秒単位)。
したがって、タイムスタンプは UTC/GMT であるため、データベースに保存すると、サーバーのタイム ゾーンに関係なく、この日付は正確になります。
2) タイムゾーンに応じて表示用のタイムスタンプをフォーマットするのが正しいアプローチです。
3) 新しい java.util.Date インスタンスを作成して getTime() を呼び出すと、Java で GMT+0 のタイムスタンプが取得されます。
マークのポイントに追加するには、java.util.Date を取得したら、それを (ユーザーが選択した) 任意のタイムゾーンに「変換」できます。Groovy でのコード サンプルを次に示します (わずかな変更で Java で動作します)。
// This is a test to prove that in Java, you can create ONE java.util.Date
// and easily re-display it in different TimeZones
fmtStr = "MM/dd/yyyy hh:mm aa zzz"
myDate = new java.util.Date()
sdf = new java.text.SimpleDateFormat(fmtStr)
// Default TimeZone
println "Date formatted with default TimeZone: " + sdf.format(myDate)
// GMT
sdf.setTimeZone(TimeZone.getTimeZone("GMT"))
println "Date formatted with GMT TimeZone: " + sdf.format(myDate)
// America/New_York
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"))
println "Date formatted with America/New_York TimeZone: " + sdf.format(myDate)
// PST
sdf.setTimeZone(TimeZone.getTimeZone("PST"))
println "Date formatted with PST TimeZone: " + sdf.format(myDate)
デフォルトでは、Java で日付を現在のタイムゾーンで取得する場合、TimeZoneクラスを使用して、システム時刻が実行されているタイムゾーンを取得できます。ほとんどのデータベースは、日付をタイムゾーンと共に保存できることをサポートしています。これはおそらく正しい方法です。これを行うには、正確にどのような形式であるかは、使用するデータベースに依存する可能性があります。
Date を「ホルダー」としてのみ使用し、代わりに Calendar インスタンスを使用することをお勧めします。GMT タイム ゾーンのカレンダーを取得するには、次のようにします。
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+00"))
カレンダーは、時間と日付を扱うときに非常に役立ちます。たとえば、これに 1 時間を追加するのは簡単です。
cal.add(Calendar.HOUR, 1);
最後に、日付が必要な場合は、これを使用します。
Date date = cal.getTime();
Q3 では、ZonedDateTime クラスの使用を検討してください。