gpt4 book ai didi

java - DST 与 Joda Time 的转换

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:55:50 27 4
gpt4 key购买 nike

我必须在 Java 应用程序中计算 DST 转换并查询 stackoverflow 我发现 joda time 有一个很好的 API 可以很容易地完成这项工作。但实际上它给了我错误的结果(或者至少看起来是这样)。

我编写了一个示例程序来打印过去 5 年和 future 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 转换的时间似乎是错误的。

我是 joda API 的新手,所以我可能忽略了一些东西。实际问题可能是:如何确定正确的过渡时间?

问候

塞巴斯蒂安

最佳答案

过渡处不连续。 25.03.12 02:0025.03.12 03:00 相同,10 月反之亦然,只是从 02:00 开始事情变得更复杂到 03:00 重复。

看起来 Joda 在过渡的“稍后”方面给了你时间——即转换发生后的时间。要查找过渡“之前”的时间,请按 DST 偏移量进行调整。

关于java - DST 与 Joda Time 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12506978/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com