如何获取夏令时开始和结束的日期?

问题描述:

我想在Android中获得夏令时的过渡日期。这是夏令时开始和结束的具体时区的日期。如何获取夏令时开始和结束的日期?

我该怎么做?

你刚刚步入一个非常杂乱布满荆棘。夏令时的规则很复杂,由人设定,所以没有可以使用的算法。有关想法,请参阅此页:http://home.tiscali.nl/~t876506/TZworld.html。这只显示目前的规则。如果您想以编程方式或过去的日期获取规则,则需要直接查询tz数据库。这并不容易也不重要,而且这个过程需要花费更长的时间来进行解释(另外,我必须弄清楚:)),但您需要开始使用的信息位于此页面上:http://www.twinsun.com/tz/tz-link.htm

如果你正在做的时间计算,需要采取移位考虑,它会更容易,只需使用乔达时间。这里有一个链接:http://joda-time.sourceforge.net/。它具有所有的tz数据库信息,所以你不必解析它。您需要保持最新状态,因为规则会定期更改。

作为一个侧面说明,有可能是查询夏令开始和结束日期出乔达时间对于给定的时区的方式,但我找不到它。

+0

对于任何绊倒这个职位的人。关于如何使用Joda-Time来获取下一个时区转换,还有另一个关于*的答案:http://*.com/questions/1449500/get-daylight-saving-transition-dates-for-time-zones-in- java的 – Mike 2011-08-17 15:22:24

有没有办法直接做到这一点,但你可以使用TimeZone.isDaylightTime(日期),如:

TimeZone tz = TimeZone.getTimeZone ("America/Denver") ; 
Date date = new GregorianCalendar (2010, 10, 15).getTime() ; 
if (tz.isDaylightTime (date)) { 
// dst in effect code 
    } 
else { 
// dst not in effect code 
    } 

当然,得到的开始日期(如果那是你真的需要什么) ,你需要迭代给定年份的所有日期并检查每个日期......这将是非常低效的。另外,正如上面的答案中所指出的,据我所知,夏时制时间信息被编译到java.util库中,所以如果某个特定市镇改变了它在dst开始/结束时的规则,你将得到不正确的结果。

另外,似乎在Android中java.util.TimeZone中实现(至少在2.2)断裂。例如

TimeZone denver = TimeZone.getTimeZone ("America/Denver") ; 
TimeZone phoenix = TimeZone.getTimeZone ("America/Phoenix") ; 

== true; //它不应该

在Eclipse的模拟下运行,denver.hasSameRules(phoenix)返回true,它应该返回false:两者都是格林威治标准时间-7:00,但菲尼克斯不使用dst。我无法访问任何Android设备来测试这是否只是模拟器的问题。我实际上开始搜索这个档案,为这个丹佛==凤凰问题的答案,并遇到你的帖子,所以认为我会回答。