我正在尝试获取Android中夏令时的过渡日期。这是夏令时在特定时区开始和结束的日期。
我该怎么做?
答案 0 :(得分:3)
没有办法直接这样做,但你可以使用TimeZone.isDaylightTime(Date),如:
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开始/结束的法律,你将得到不正确的结果。 / p>
此外,似乎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:两者都是GMT-7:00但是Phoenix不使用dst。我无法访问任何Android设备来测试这是否只是模拟器的问题。我实际上开始在这个档案中搜索这个丹佛==凤凰问题的答案并且发现了你的帖子,所以我想我会回答。
答案 1 :(得分:1)
你刚刚进入一个非常凌乱的石楠补丁。夏令时的规则很复杂,由人设定,因此没有可以使用的算法。有关想法,请参阅此页面:http://home.tiscali.nl/~t876506/TZworld.html。这只显示了当前的规则。如果您想以编程方式或过去日期获取规则,则需要直接查询tz数据库。这不容易也不简单,这个过程需要花费更长的时间来解释,而不是在这里适当(同样,我必须弄明白:))但是你需要开始的信息在这个页面上:http://www.twinsun.com/tz/tz-link.htm。
如果您正在进行时间计算并需要考虑转变,那么使用joda-time会更容易。这是一个指向它的链接:http://joda-time.sourceforge.net/。它具有所有tz数据库信息,因此您无需解析它。您需要保持最新状态,因为规则会定期更改。
作为旁注,可能有一种方法可以在给定时区的joda-time之外查询夏令时开始和结束日期,但我找不到它。