13

Joda time (1.6)ライブラリを使用していますが、GMTではなくBritishSummerTimeという間違ったタイムゾーンのDateTimeオブジェクトが返され続けます。

私のWindowsワークステーション(JDK 1.6.0_16を実行)はGMTであると見なし、JDKの日付/時刻クラスからデフォルトのタイムゾーンを取得した場合、それは正しい(GMT)です。Linuxサーバーでも同じ動作がします。Jodaのタイムゾーンデータベースファイルでエラーが発生している可能性があると考えたため、最新のデータベースを使用してjarを再構築しましたが、変更はありませんでした。

import java.util.TimeZone;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalTime;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;

public class TimeZoneTest {

    public static void main(String[] args) {                
        DateTimeFormatter timeParser = ISODateTimeFormat.timeParser();
        TimeZone timeZone = TimeZone.getDefault();
        System.out.println(timeZone.getID()); // "Europe/London"
        System.out.println(timeZone.getDisplayName()); // "Greenwich Mean Time"

        DateTimeZone defaultTimeZone = DateTimeZone.getDefault();
        System.out.println(defaultTimeZone.getID()); //"Europe/London"
        System.out.println(defaultTimeZone.getName(0L)); //"British Summer Time"

        DateTime currentTime = new DateTime();
        DateTimeZone currentZone = currentTime.getZone();
        System.out.println(currentZone.getID()); //"Europe/London"
        System.out.println(currentZone.getName(0L)); //"British Summer Time"            
    }
}

の静的イニシャライザーを介してデバッグすると、呼び出しが期待どおりに行われるorg.joda.time.DateTimeZoneことがわかります。System.getProperty("user.timezone")"Europe/London"

4

2 に答える 2

30

さて、これの根源にたどり着くには、英国の夏時間が実際に何を意味するのか、そしてそれがいつ行われたのかを理解する必要があります。短くするために、その時点でのタイムゾーンの名前を検索します0L。これは英国夏時間でした。getName()1970-01-01T00:00:00ZDefaultTimeZone

差出人:http ://www.nmm.ac.uk/explore/astronomy-and-time/time-facts/british-summer-time

1968年に時計は2月18日にGMTより1時間早く進み、1968年10月27日から1971年10月31日までの間に時計が一年中GMTよりも進んでいた英国標準時までその状態が続きました。

代わりに、から適切なミリ秒数を渡す場合1970-01-01T00:00:00Z。例:

defaultTimeZone.getName(new GregorianCalendar().getTimeInMillis())

あなたも正しい文字列を取得します。基本的に、getName()メソッドに間違ったパラメーターを指定したため、予期しない結果が発生しました。

詳細を確認したい場合はorg/joda/time/tz/src、joda sourceのファイルをチェックして、jodaがタイムゾーンを決定する方法を確認してください。


それ以外の

defaultTimeZone.getName(0L)

あなたが使うことができます

defaultTimeZone.toTimeZone().getDisplayName()

それは私のためにそれをします。

于 2009-11-11T10:40:31.020 に答える
0

1.6のDateTimeZoneクラスの静的イニシャライザーを見ると興味深いかもしれません。

static {
    setProvider0(null);
    setNameProvider0(null);

    try {
        try {
            cDefault = forID(System.getProperty("user.timezone"));
        } catch (RuntimeException ex) {
            // ignored
        }
        if (cDefault == null) {
            cDefault = forTimeZone(TimeZone.getDefault());
        }
    } catch (IllegalArgumentException ex) {
        // ignored
    }

    if (cDefault == null) {
        cDefault = UTC;
    }
}

私の推測では、user.timezoneプロパティが定義されている(そしてBSTに設定されている)と思います。それ以外の場合、JodaはJDKタイムゾーンに基づいて独自のタイムゾーンインスタンスを作成する必要があるようです。そして、この分野のバグ、特にGMTゾーンの変換は、これまでに発見されていたと思います。

于 2009-11-11T10:34:40.233 に答える