2011-02-02 3 views
2

私のBlackBerryアプリでは、正確なタイムゾーンのサポートが必要です。 J2MEを実行するため、Joda Timeはオプションではありません。他の人の助けを借りて、私はJavaの組み込みのタイムゾーンサポートを私のために働かせる方法を考え出しましたが、夏時間から夏時間以外の間違いへのスイッチオーバーを依然として得ていることが判明しました。午前2時3月13日である2011年にJ2MEでのタイムゾーンの正確なサポート

TimeZone zone = TimeZone.getTimeZone("America/Los_Angeles"); 
Calendar calendar = Calendar.getInstance(); 
calendar.setTimeZone(zone); 

calendar.set(2011, Calendar.MARCH, 13, 1, 0, 0);  
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND))); 

calendar.set(2011, Calendar.MARCH, 13, 6, 0, 0); 
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND))); 

calendar.set(2011, Calendar.MARCH, 13, 23, 59, 59); 
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND))); 

calendar.set(2011, Calendar.MARCH, 14, 0, 0, 1); 
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar.get(Calendar.MILLISECOND))); 

スイッチオーバーのが、Javaは、3月14日の深夜にそれを持っている:あなたもJava 6の上で、それを自分で試すことができます。つまり、1日中ほぼ間違っているということです。それは容認できない。

私はthisに基づいて自分のtzdataパーサーを実装し、私のアプリでtzdataファイルを出荷しましたが、もっと良い方法があるのだろうかと思います。あなたはそれを知っていますか?私はこの問題に最初に遭遇することはできません。

答えて

3

私はそれを理解しました。 Javaは責任を負うことはありません。

問題は、TimeZone.getOffset()の最後のパラメータにcalendar.get(Calendar.MILLISECOND)を使用したことです。この値は、カレンダー内の日付のミリ秒の部分ですが、TimeZone.getOffset()は、1日中経過したミリ秒数を示します。

calendar.set(2011, Calendar.MARCH, 13, 1, 0, 0);  
int millis = 
    calendar.get(Calendar.MILLISECOND) + 
    calendar.get(Calendar.SECOND) * 1000 + 
    calendar.get(Calendar.MINUTE) * 60 * 1000 + 
    calendar.get(Calendar.HOUR_OF_DAY) * 60 * 60 * 1000; 
System.out.println(zone.getOffset(1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), millis)); 
+0

私はほぼ同じミスをした:

これは修正されたコードです。 javadocのコメントには情報がありますが、メソッドのパラメータの奇妙なセットと 'millis'パラメータの名前は簡単にはなりません。 :) – vaughandroid

関連する問題