3

JavaアプリケーションでDST遷移を計算し、stackoverflowをクエリする必要があります。これを行うには、jodatimeに優れたAPIがあることがわかりました。しかし、実際には間違った結果が得られます(または少なくともそうであるように見えます)。

過去5年間と今後5年間のトランジションを印刷するサンプルプログラムを作成しました。

public static void main(final String[] args)
{
    TimeZone javaZone = TimeZone.getDefault();
    DateTimeZone jodaTimezone = DateTimeZone.forTimeZone(javaZone);
    Calendar[] dstTransitions;
    DateTime jodaNewYear;
    int dstSavings;
    final Calendar calendar = Calendar.getInstance(javaZone);
    final DateFormat df = DateFormat.getDateTimeInstance();

    // use the correct timezone for displaying the date and time on console
    df.setTimeZone(javaZone);

    calendar.setTimeInMillis(System.currentTimeMillis());


    for (int i = -5; i < 5; i++)
    {
        jodaNewYear = new DateTime(calendar.get(Calendar.YEAR) + i, 1, 1, 0, 0, 0, jodaTimezone);

        dstTransitions = new Calendar[2];
        dstTransitions[0] = Calendar.getInstance(javaZone);
        dstTransitions[0].setTimeInMillis(jodaTimezone.nextTransition(jodaNewYear.getMillis()));
        dstTransitions[1] = Calendar.getInstance(javaZone);
        dstTransitions[1].setTimeInMillis(jodaTimezone.nextTransition(dstTransitions[0].getTimeInMillis()));

        dstSavings = javaZone.getDSTSavings() / 1000;


        System.out.println("DST transitions for " + javaZone.getID() + " in " + jodaNewYear.getYear() + ":");
        System.out.println("To DST.....: " + df.format(dstTransitions[0].getTime()));
        System.out.println("From DST...: " + df.format(dstTransitions[1].getTime()));
        System.out.println("DST offset.: " + dstSavings + " sec");
        System.out.println("--------------------------------------------------------------------");
    }
}

これにより、私のマシンで次の出力が得られます(抜粋)。

DST transitions for Europe/Berlin in 2007:
To DST.....: 25.03.2007 03:00:00
From DST...: 28.10.2007 02:00:00
DST offset.: 3600 sec
--------------------------------------------------------------------
DST transitions for Europe/Berlin in 2008:
To DST.....: 30.03.2008 03:00:00
From DST...: 26.10.2008 02:00:00
DST offset.: 3600 sec
--------------------------------------------------------------------
DST transitions for Europe/Berlin in 2009:
To DST.....: 29.03.2009 03:00:00
From DST...: 25.10.2009 02:00:00
DST offset.: 3600 sec
--------------------------------------------------------------------
DST transitions for Europe/Berlin in 2010:
To DST.....: 28.03.2010 03:00:00
From DST...: 31.10.2010 02:00:00
DST offset.: 3600 sec
--------------------------------------------------------------------
DST transitions for Europe/Berlin in 2011:
To DST.....: 27.03.2011 03:00:00
From DST...: 30.10.2011 02:00:00
DST offset.: 3600 sec
--------------------------------------------------------------------
DST transitions for Europe/Berlin in 2012:
To DST.....: 25.03.2012 03:00:00
From DST...: 28.10.2012 02:00:00
DST offset.: 3600 sec

見た目は大丈夫ですが、時代に問題があります。実際、DSTへの移行は、3月の最終日曜日の午前2時に行われ、逆方向の移行は、10月の最終日曜日の午前3時に行われます。したがって、joda遷移の時間は間違っているようです。

私はjodaAPIにまったく慣れていないので、何かを見落としている可能性があります。実際の質問は次のとおりです。正しい遷移時間をどのように決定できますか?

よろしく

セバスチャン

4

1 に答える 1

3

移行時に不連続性があります。25.03.12 02:00はと同じ瞬間25.03.12 03:00であり、10月の場合はその逆ですが、02:00から03:00までの時間が繰り返されるため、状況がより複雑になります。

Jodaがトランジションの「遅い」側の時間を与えているように見えます。つまり、トランジションが発生してからの時間です。遷移の「直前」の時間を見つけるには、DSTオフセットで調整します。

于 2012-09-20T06:21:58.043 に答える