2016-11-17 17 views
0

ブラウザのオフセット時間を使用して、特定の時刻を現地時刻に変換しています。ここでは、atlantic timezone(-4:00)からISTに変換するために使用しているコードを示します。ブラウザのオフセットによる時間変換

int hours=23; 
int mins =30; 
Calendar date=Calendar.getInstance(); 
date.set(Calendar.HOUR_OF_DAY, hours); 
date.set(Calendar.MINUTE, mins); 
browserOffsetTime=-browserOffsetTime; 
TimeZone defaultTZ=TimeZone.getTimeZone("Atlantic/Bermuda"); 
int serverTimeOffset=defaultTZ.getRawOffset()+defaultTZ.getDSTSavings(); 
Date GMTDate= new Date(date.getTimeInMillis() - serverTimeOffset); 
Date userBrowserTime = new Date(GMTDate.getTime() + browserOffsetTime); 
Calendar cal1=Calendar.getInstance(); 
cal1.setTime(userBrowserTime); 

このコードは、それが9:00であるべきである8:00を返すように10:00であるESTの正確な結果を返します。

https://stackoverflow.com/a/21349556/3739916このコードは、両方のタイムゾーンの正確な結果を返します。しかし、私はブラウザのオフセット時間を使ってこれを解決する必要があります。

+1

1時間の不一致を説明するために夏時間の問題がありますか? –

+0

@TimBiegeleisen夏時間を追加せずにチェックしましたが、結果は同じです。 – SwethaHarshini

+0

@TimBiegeleisen申し訳ありませんが、すぐにあなたを理解できませんでした。ですから、時間の変換にブラウザのオフセット時間を使用しないでください。 – SwethaHarshini

答えて

1

あなたが作っているいくつかの一般的なミス: - おそらくnew Date().getTimezoneOffset()のようなJavaScriptのコードをあなたが持っている

  • は、ブラウザから取得したことをオフセット固定します。これは、現在の日付と時刻にのクライアントのUTCからのオフセットです。任意のタイムスタンプにこのオフセットを適用することはできません。クライアントのオフセットは、要求している時点によって異なります。 the timezone tag wikiの "time zone!= offset"を参照し、ユーザーの実際のタイムゾーンを推測する方法はthis answerを参照してください。

  • タイムスタンプとオフセットの手動操作は、加算と減算によって大量に行われています。この種のコードは、日付/時刻ライブラリを作成している場合を除き、避けるべきです。 Javaには、Java 7以前ではJoda-Time、Java 8以降ではthe built-in java.time packageなど、多くの優れたオプションがあります。 java.util.Dateおよびjava.util.Calendar APIは、多くの場合、の問題があるため、使用しないでください。

  • new Date(timestamp + offset)のような操作を行うと、実際にタイムゾーン変換を実行していません。 java.util.Dateオブジェクトとやり取りするすべてのものは、タイムスタンプがUTC(1970-01-01T00:00:00Z)の観点から明示的に示されているUnix Epochに基づいていることを期待しています。したがって、オフセットを加算または減算した場合、は時刻が異なる瞬間を選択するだけです。新しいAPIを使用する場合、これについて考える必要はありません。

  • ベースオフセット+ DSTバイアスとしてserverTimeOffsetを計算していますが、DSTが有効かどうかは検討していません。新しいAPIを使用する場合は、これについても考える必要はありません。

関連する問題