2012-11-02 6 views
18

Javaの日付とカレンダーを使用して、1つのタイムゾーンから別のタイムゾーンに簡単な変換を取得しようとしています。私は、次のコード日付を別のタイムゾーンに変換する

Calendar instance = Calendar.getInstance(TimeZone.getTimeZone("Europe/London")); 
    Date date = instance.getTime(); 
    System.out.println(date); 

    GregorianCalendar instance2 = new GregorianCalendar(TimeZone.getTimeZone("Europe/Athens")); 
    instance2.setTime(instance.getTime()); 
    System.out.println(instance2.getTime()); 

を実行しようとしていますが、それはまだかなり+1時間よりも、同じ日付を返す...全体の問題は些細なようだが、私はこれまで任意の単純な答えを見つけることができません。あなたの助けを前にありがとう。

+4

[Joda time](http://stackoverflow.com/a/375803/1037210)を使用しますか?それは私の好みです。 – Lion

+0

[この回答](http://stackoverflow.com/questions/230126/how-to-handle-calendar-timezones-using-java)をチェックしてください。それは便利になるかもしれない。 – Gamb

+0

日付の文字列を解析し、対応するタイムゾーンで日付を返すために、日付形式を使用することが最もクリーンな解決策であるWeb上で別のものが見つかりました – Bober02

答えて

31

あなたがSystem.out.println(date); or System.out.println(instance2.getTime());を使用して日付を印刷するとき、instance2.getTime()によって返さDateTimeZone independentであり、常にローカルタイムゾーンで日付を印刷します。

代わりに、あなたはDateFormat/SimpleDateFormatを使用することもできます。

DateFormat formatter= new SimpleDateFormat("MM/dd/yyyy HH:mm:ss Z"); 
    formatter.setTimeZone(TimeZone.getTimeZone("Europe/London")); 
    System.out.println(formatter.format(date)); 

    formatter.setTimeZone(TimeZone.getTimeZone("Europe/Athens")); 
    System.out.println(formatter.format(instance2.getTime())) 
+0

あなたはローカルタイムゾーンで、EPOCH秒ではありません(タイムゾーンに依存しません)? http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#getTime() – akaIDIOT

+0

@akaIDIOT内部表現はエポック以降です。日付が印刷されるとローカルタイムゾーンが使用されます'java.util.Date'の機能/バグです。 – dan

+0

@ Bober02:もっと良いものを見つけましたか?はいの場合は、共有してください。 –

2

あなたは受け入れ答えが正しい次のコードスニペット

String dateString = "14 Jul 2014 00:11:04 CEST"; 
date = formatter.parse(dateString); 
System.out.println(formatter.format(date)); 

// Set the formatter to use a different timezone - Indochina Time 
formatter.setTimeZone(TimeZone.getTimeZone("Asia/Bangkok")); 
System.out.println("ICT time : "+formatter.format(date)); 
8

を使用することができます。 java.util.Dateクラスにはというタイムゾーンは割り当てられていませんが、toStringの実装ではJVMの現在のデフォルトタイムゾーンが混乱しています。

java.util.Date & .Calendar

これは、Javaにバンドル悪名高い厄介java.util.Date、.Calendar、とのSimpleDateFormatクラスを避けるために多くの理由の一つですが避けてください。それらを避けてください。代わりに、次のいずれかを使用します

ジョダタイム

2.3は、以下のジョダ時間でいくつかのサンプルコード。 StackOverflowでもっと多くの例と議論ができます。

DateTimeZone timeZoneLondon = DateTimeZone.forID("Europe/London"); 
DateTimeZone timeZoneAthens = DateTimeZone.forID("Europe/Athens"); 

DateTime nowLondon = DateTime.now(timeZoneLondon); 
DateTime nowAthens = nowLondon.withZone(timeZoneAthens); 
DateTime nowUtc = nowLondon.withZone(DateTimeZone.UTC); 

java.timeは

のJava 8以降の新しいjava.time package内蔵しています。このパッケージはJoda-Timeからインスパイアされました。彼らはいくつかの類似点とクラス名を共有していますが、それらは異なっています。それぞれに欠けている機能があります。注目すべき違いの1つは、java.timeがコンストラクタを回避し、静的インスタンス化メソッドを使用する点です。

この質問の場合、同じ方法で動作します。タイムゾーンを指定し、nowメソッドを呼び出して現在の瞬間を取得し、古い不変インスタンスに基づいて新しいインスタンスを作成してタイムゾーンを調整します。

2つの異なるタイムゾーンクラスに注意してください。 1つは、サマータイムとその他の異常のすべてのルールとUTCからのオフセットを含む名前付きタイムゾーンで、もう1つはオフセットのみです。†

ZoneId zoneMontréal = ZoneId.of("America/Montreal"); 
ZonedDateTime nowMontréal = ZonedDateTime.now (zoneMontréal); 

ZoneId zoneTokyo = ZoneId.of("Asia/Tokyo"); 
ZonedDateTime nowTokyo = nowMontréal.withZoneSameInstant(zoneTokyo); 

ZonedDateTime nowUtc = nowMontréal.withZoneSameInstant(ZoneOffset.UTC); 

実際java.util.Dateクラスits source code内に埋め込まれたタイムゾーンを持っていません。しかし、このクラスは、ほとんどの実用的な目的のために、そのタイムゾーンを無視します。したがって、省略形として、j.u.Dateにはタイムゾーンが割り当てられていないと言われることがよくあります。混乱している?はい。 j.u.Dateの混乱を避け、Joda-Timeやjava.timeを使用してください。

関連する問題