Javaの異なるTimeZoneで現在の時刻を取得するにはどうすればよいですか?
質問
OK-このような基本的な質問をするのはかなり馬鹿げていますが、ちょっとです。
Java webappの異なるタイムゾーンで現在の時刻を取得しようとしています。私は次の明白な解決策を試しました:私のサーブレットで、
Calendar localCalendar = Calendar.getInstance(myBean.getTimeZone());
その後、カレンダーオブジェクトをリクエスト属性「localCalendar」としてJSPに渡します:
It is now: [${requestScope.localCalendar.time}]
in TimeZone ${requestScope.localCalendar.timeZone.ID}
しかし、私の出力は設定されたタイムゾーンを無視しているようです、つまり
現在:TimeZone Indian / Maheの[Thu Nov 26 10:01:03 GMT 2009]
ロケール設定と関係があると思いますが、別のタイムゾーンでロケールの時刻をフォーマットする方法はありますか?
解決
Calendar
の内部データは基本的に次のとおりです。
時刻は、1970年1月1日00:00:00.000 GMT(グレゴリオ暦)のエポックからのオフセットであるミリ秒値で表すことができます。
そのため、どの操作を使用しても同じになる long
を保持し、 toString
は約束しません。
ロケールおよびタイムゾーンごとに日付をフォーマットします。これは、 JSTL または DateFormat を使用して、値を文字列として返します。
他のヒント
特定の形式/タイムゾーンで日付を表示する場合は、 SimpleDateFormat
McDowellによる回答は正しいですが、 java.util.Calendar
(および java.util.Date
)クラスは時代遅れです。
java.time
java.timeフレームワークはJava 8以降に組み込まれており、Java 6&にバックポートされています。 7およびAndroid。これらの新しいクラスは、設計が不十分で、混乱し、厄介であることが証明されているため、古い日時クラスに取って代わります。
Instant
はUTCの現在の瞬間です。
Instant now = Instant.now();
タイムゾーン ZoneId
を適用して、 ZonedDateTime
を取得します。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
タイムゾーンとロケール
タイムゾーンおよび Locale
は直交する問題です。タイムゾーンは、壁時計時間、 UTCからのオフセット。 Locale
はプレゼンテーションにのみ影響します。ロケールは、(a)日と月の名前の人間の言語、および(b)月の前の月、カンマと期間などの問題に関する文化的規範に使用されます。
たとえば、フランス語を読む Qué bé cois ユーザーがインド。したがって、 Asia / Kolkata
のタイムゾーンを使用し、 Locale.CANADA_FRENCH
。
フォーマットされた文字列を生成するには、を使用します。 DateTimeFormatter
クラス。 Stack Overflowにはすでに多くの例があります。 withLocale
メソッド。