タイムゾーンとサマータイムは悪夢です。このタスクを自分で引き受けるべきではありません。重労働は Joda-Time にお任せください。
同様の質問に対するこの回答を参照してください。 Using Joda time to get UTC offset for a given date and timezone . クラスDateTimeZoneはgetOffset()メソッドを提供します。
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
先行ゼロ付き。