+-
java-使用Joda Time进行DST转换
我必须计算 Java应用程序中的DST转换并查询stackoverflow,我发现joda time有一个不错的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:00进行的,而向后过渡则是在10月的最后一个星期日凌晨3:00进行.因此,乔达转型的时代似乎是错误的.

我对joda API完全陌生,因此我可能忽略了一些东西.可能的实际问题是:如何确定正确的过渡时间?

问候

塞巴斯蒂安

最佳答案
过渡时不连续. 25.03.12 02:00与25.03.12 03:00是相同的时刻,反之亦然,在10月,除了由于02:00至03:00的时间重复而使情况变得更复杂之外,其他时间也是如此.

看起来,乔达在过渡的“后期”给您时间-即过渡发生后的时间是什么.要找到转换“之前”的时间,请按DST偏移量进行调整.

点击查看更多相关文章

转载注明原文:java-使用Joda Time进行DST转换 - 乐贴网