2012-04-25 29 views
0

残念ですが、これは再投稿です。私は適切な答えを見つけられませんでした。JavaおよびWindows地域の設定

廃止予定のapisのベストプラクティスと使用方法は無視してください。

私は次のように日付 "月5月19日2時16分52秒EDT 2003" をフォーマットしたい "MM/DD/YYYY HH:mm:ssの"。ここでも出力フォーマットを変更したいだけですが、これはESTのラップトップから実行されています。

マイWindowsの地域設定は以下のとおりです。

現在のタイムゾーン:東部夏時間

タイムゾーン:(GMT-05:00)東部標準時(米国&カナダ)

夏時間の変更のクロックを自動的に調整します。Ch

をeckedこのJavaコードは、それをしない:

Date aDate = new Date("Mon May 19 02:16:52 EDT 2003"); 
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
System.out.println("Formatted Date: " + sdf.format(aDate)); 

出力は

Formatted Date: 05/19/2003 02:16:52 

今、私は次のように設定画面(のみDST設定のチェックを外す)

を変更で現在のタイムゾーン:東部夏時間

タイムゾーン:(GMT-05:00)東部標準時(米国&カナダ)

が自動的に夏時間の調整をする:チェック

出力は次のようになります。

Formatted Date: 05/19/2003 01:16:52 

質問:

  1. なぜ1時間単位で出力がオフになっていますか?
  2. javaはフォーマット時にWindows DST設定を使用しますか?私はjavaがさまざまなタイムゾーンのDST設定時間のための独自のデータを保持しています。
+1

はい、 JavaはOS settinを使用しますそれはWindowsでも別のOSでも構いません – GETah

+0

なぜJavaは自分の出力を変更しますか?私は使用する日付と出力する形式をjavaに伝えています。興味深いもの: – user1318311

答えて

1

内部的には、日付は、あるエポックを超えたミリ秒数を表す長い値によって格納されます。マシンで夏時間をクリックすると、タイムゾーンが変更されました。だから、Javaは異なるタイムゾーンで同じ時刻を使用しているので、あなたが持っているものがあるのです

+0

ありがとうございました。それは役に立ちました。 – user1318311

+0

満足しているときに正しい答えをチェックしてください(これには待ち時間があるかもしれません) – ControlAltDel

1

夏時間は通常の1時間前ですので、カレンダーを1月に設定すると、違いは見られません。

+0

だから、いつOSの設定を使用して終了したら、JavaはOlson Timezone DBをいつ使用するのですか。 – user1318311

0

デフォルトでは、SimpleDateFormatはシステムのタイムゾーンで日付を表示するからです。これをチェックするには、タイムゾーンの出力を "MM/dd/yyyy HH:mm:ss z"の形式で追加します。これにより、実際にタイムゾーンに値が表示されます。

値の書式を設定するタイムゾーンを制御するには、DateFormat.setTimeZone(TimeZone z)メソッドを使用します。

1

日付を作成すると、Javaは内部的に値をGMTとして保存します。日付を文字列にフォーマットすると、Javaはコンピュータのタイムゾーンを使用して日付をあなたのローカルタイムゾーンに変換します。これは異なる結果をもたらす理由です。

System.out.println(new Date("Mon May 19 02:16:52 UTC 2003")); 
System.out.println(new Date("Mon May 19 02:16:52 EDT 2003")); 
System.out.println(new Date("Mon May 19 02:16:52 PST 2003")); 

は、私は次のような結果を得る::私は(タイムゾーンCESTで)私のコンピュータ上で次のコードを実行した場合の例として、

Mon May 19 04:16:52 CEST 2003 
Mon May 19 08:16:52 CEST 2003 
Mon May 19 12:16:52 CEST 2003 

あなたはより予測可能な結果を​​たい場合は可能性がありませんか(入力と出力が同一の時間帯で入力と出力が実行されている限り)使用するタイムゾーンを指定するより信頼性の高い方法を使用してください。

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
sdf.setTimeZone(TimeZone.getTimeZone("EDT")); 
関連する問題