5

これを確認するためだけに、現在の場所のタイムゾーンオフセットを計算するために、この不自由で脳死の方法があります。サマータイムが問題になったときに調整する必要があるのではないかと思います (現在、私の場所では CET タイムゾーンが冬時間なので、確認するのは困難です)。

// The local time zone's offset
private  int getLocalOffset() {
    DateTimeZone defaultZone = DateTimeZone.getDefault();
    return defaultZone.getOffset(null) / 1000 / 60 / 60;
}

ヒントをありがとう。

4

3 に答える 3

8

タイムゾーンとサマータイムは悪夢です。このタスクを自分で引き受けるべきではありません。重労働は Joda-Time にお任せください。

同様の質問に対するこの回答を参照してください。 Using Joda time to get UTC offset for a given date and timezone . クラスDateTimeZonegetOffset()メソッドを提供します。

Java 7 の Joda-Time 2.3 のサンプル ソース コード…</p>

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

org.joda.time.DateTimeZone californiaTimeZone = org.joda.time.DateTimeZone.forID("America/Los_Angeles");

org.joda.time.DateTime now = new org.joda.time.DateTime(californiaTimeZone);
int millisecondOffsetToAddToUtcToGetLocalTime = californiaTimeZone.getOffset( now );

System.out.println( "millisecondOffsetToAddToUtcToGetLocalTime: " + millisecondOffsetToAddToUtcToGetLocalTime );

// Note the casting to doubles to avoid integer truncation. Time zone offsets are NOT always whole hours.
System.out.println( "Offset in decimal hours: " + (double)millisecondOffsetToAddToUtcToGetLocalTime / 1000d / 60d / 60d );

2013-11-20T01:03:56.464-08:00 で実行すると…</p>

millisecondOffsetToAddToUtcToGetLocalTime: -28800000
millisecondOffsetToAddToUtcToGetLocalTime in hours: -8.0

重要その数値形式は、オフセットに-8.0は正しくありません。次のいずれかである必要があります。

  • -08:00コロンと 2 桁の数字 (先行ゼロで埋められます)。
  • -08先行ゼロ付き。
于 2013-11-20T08:56:18.630 に答える
3

通常、Joda time は自動的に DST を処理するので、心配する必要はありません。nullただし、 getOffset()に渡していることに気付きました。タイムゾーンのオフセットが日付に依存することを考えると、オフセットを計算する日付/時刻を実際に渡す必要があります。そうしないと、間違った結果が得られます。

また、以前のコメントで述べたように、一部のタイムゾーンには、整数時間ではないオフセットがあることに注意してください。たとえば、インドは GMT +5:30 です。

于 2013-11-14T13:31:47.473 に答える