Javaの異なるTimeZoneで現在の時刻を取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1802758

質問

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 メソッド。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top