4

Java Calendar/Date/TimeZone API を使用して、前後の DST 移行タイムスタンプを取得することは可能ですか? 私は書くことができます
Joda-Time

DateMidnight today = new DateMidnight(2009, 2, 24);
DateTimeZone zone = today.getZone();

DateTime previousTransition =
    new DateTime(zone.previousTransition(today.getMillis()));
// 2008-10-26T02:59:59.999+02:00 for Europe/Berlin
System.out.println(previousTransition);

DateTime nextTransition =
    new DateTime(zone.nextTransition(today.getMillis()));
// 2009-03-29T03:00:00.000+02:00 for Europe/Berlin
System.out.println(nextTransition);

標準の Java API でこれを行う方法はありますか?

4

4 に答える 4

4

Java Date/Calendar/TimeZone API にはそのような機能はありません

于 2009-02-24T12:40:34.547 に答える
4

そのような機能が必要なときに私が思いついた最善の方法は、Calendar を使用して、指定されたタイム ゾーンで 1 年を通して反復し、毎日の各時間が DST の始まりか終わりかを尋ねることです。

Sun の JVM では、TimeZone (sun.util.calendar.ZoneInfo) の実装がタイム ゾーンの移行に関するデータを何らかの「コンパイル済み」形式で保持するため、このようにする必要があります。

コードは次のようになります。

public class Dst {
    Date start;
    Date end;

    public static Dst calculate(TimeZone tz, int year) {
        final Calendar c = Calendar.getInstance(tz);
        c.setLenient(false);
        c.set(year, Calendar.JANUARY, 1, 1, 0, 0);
        c.set(Calendar.MILLISECOND, 0);

        if (tz.getDSTSavings() == 0) {
            return null;
        }

        Dst dst = new Dst();

        boolean flag = false;

        do {
            Date date = c.getTime();
            boolean daylight = tz.inDaylightTime(date);

            if (daylight && !flag) {
                flag = true;
                dst.start = date;
            }
            else if (!daylight && flag) {
                flag = false;
                dst.end = date;
            }

            c.add(Calendar.HOUR_OF_DAY, 1);
        }
        while (c.get(Calendar.YEAR) == year);

        return dst;
    }
}

もちろん、これらの計算などの結果をキャッシュ/メモ化することは理にかなっています。

お役に立てれば。

于 2009-02-24T13:53:56.807 に答える
1

はい、これを Java API から間接的に取得する方法があります。これをチェックして、これが問題に対して機能するかどうかをお知らせください:

http://monisiqbal.blogspot.com/2009/12/retriving-time-zones-dst-information.html

これにより、今年の必要な情報が得られます。必要に応じて、前の年についても簡単に同じことができます。

于 2010-02-01T10:33:23.887 に答える