Determine Whether Daylight Savings Time (DST) is Active in Java for a Specified Date
我有一个Java类,它占用一个位置的纬度/经度,并在夏时制开启和关闭时返回GMT偏移量。我正在寻找一个简单的方法来确定Java如果当前日期是在夏令时间,所以我可以应用正确的偏移量。目前,我只对美国时区进行这种计算,尽管最终我希望将其扩展到全球时区。
这是问题所在机器的答案:
试图为客户机解决这个问题的服务器需要客户机的时区。请参阅@powerlord answer了解原因。
对于任何特定时区
DR
1 2 3 4 5 | ZoneId.of("America/Montreal" ) // Represent a specific time zone, the history of past, present, and future changes to the offset-from-UTC used by the people of a certain region. .getRules() // Obtain the list of those changes in offset. .isDaylightSavings( // See if the people of this region are observing Daylight Saving Time at a specific moment. Instant.now() // Specify the moment. Here we capture the current moment at runtime. ) // Returns a boolean. |
Java.时间
下面是Mamboking正确答案的现代java.time(参见教程)版本。
ZoneId 表示时区。该类知道用于判断DST是否适用于特定时区的规则。ZoneRules 类为一个时区的所有历史和未来过渡建模。Instant 是UTC时间线上的一个时刻。ZonedDateTime 是将ZoneId 应用于Instant 的结果。
示例代码:
1 2 3 4 5 | ZonedDateTime now = ZonedDateTime.now( ZoneId.of("America/Montreal" ) ); … ZoneId z = now.getZone(); ZoneRules zoneRules = z.getRules(); Boolean isDst = zoneRules.isDaylightSavings( now.toInstant() ); |
注意,在最后一行中,我们必须通过简单调用
JavaTimeFr框架是在Java 8和之后构建的。这些类取代了麻烦的旧遗留日期时间类,如
现在处于维护模式的joda time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程。以及搜索堆栈溢出以获得许多示例和解释。规格为JSR 310。
您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要
在哪里获取java.time类?
- JavaSE 8、Java SE 9、Java SE 10、Java SE 11,以及后来的标准JAVA API的一部分,实现了捆绑式实现。
- Java 9添加了一些小的特性和修复。
- Java SE 6和Java SE 7
- 大多数JavaTimeActudio的功能都被移植到TealEnter后端的Java 6和7中。
- 安卓
- java.time类的Android包实现的更高版本。
- 对于早期的Android(<26),threetenabp项目适应threeten backport(如上所述)。看看如何使用三连珠……
threeten额外项目使用额外的类扩展java.time。这个项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,如
你需要用这些坐标做更多的工作,找出它们在哪个时区。一旦知道了哪个时区,isDayLight()方法就会很有用。
例如,您无法判断-0500是否为EST(美国/加拿大东部标准时间)、CDT(美国/加拿大中部夏令时)、COT(哥伦比亚时间)、AST(巴西英亩标准时间)、ETC(厄瓜多尔时间)等…
其中一些可能支持夏令时,也可能不支持夏令时。
Joda Time包含将为您计算偏移量的处理方法。请参见datetimezone.convertlocaltoutc(…)
要补充这一点,您需要使用纬度/经度信息查找当前时区。GeONAMS为它的Web服务提供了一个Java客户端,以及一个简单的Web请求框架(即HTTP://WSGeNAMAM.Org/TimeZON)。lat=47.01&lng=10.2)