我必须计算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日上午2点的最后一个星期日,而向后过渡发生在10月的最后一个星期日凌晨3点。因此,joda过渡的时代似乎是错误的。
我是joda API的新手,所以我可能忽略了一些东西。可能实际问题是:我如何确定正确的过渡时间?
此致
塞巴斯蒂安
答案 0 :(得分:3)
转型过程中存在不连续性。 25.03.12 02:00
与25.03.12 03:00
是同一时刻,反之亦然10月,但自02:00至03:00重复以来事情变得更复杂。
看起来Joda给你的时间是转型的“后期” - 即。过渡发生的时间是什么时候。要在转换“之前”找到时间,请按DST偏移进行调整。