确定夏令时 (DST) 在 Java 中是否在指定日期处于活动状态tl;博士java.time关于 java.time
2022-08-31 13:47:48
我有一个Java类,它采用位置的纬度/经度,并在夏令时打开和关闭时返回GMT偏移量。我正在寻找一种简单的方法来确定Java中的当前日期是否为夏令时,以便我可以应用正确的偏移量。目前,我只对美国时区执行此计算,尽管最终我也想将其扩展到全球时区。
我有一个Java类,它采用位置的纬度/经度,并在夏令时打开和关闭时返回GMT偏移量。我正在寻找一种简单的方法来确定Java中的当前日期是否为夏令时,以便我可以应用正确的偏移量。目前,我只对美国时区执行此计算,尽管最终我也想将其扩展到全球时区。
这是要提出问题的机器的答案:
TimeZone.getDefault().inDaylightTime( new Date() );
尝试为客户端找出此问题的服务器将需要客户端的时区。请参阅@Powerlord答案以了解原因。
对于任何特定时区
TimeZone.getTimeZone( "US/Alaska").inDaylightTime( new Date() );
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.time(参见教程)版本的正确答案通过mamboking。
ZoneId
表示时区。该类知道指示 DST 是否适用于特定时区的规则。ZoneRules
类对时区的所有历史和未来转换进行建模。即时
是 UTC 时间轴上的一个时刻。ZonedDateTime
是将 应用于 .ZoneId
Instant
示例代码:
ZonedDateTime now = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
…
ZoneId z = now.getZone();
ZoneRules zoneRules = z.getRules();
Boolean isDst = zoneRules.isDaylightSavings( now.toInstant() );
请注意,在最后一行中,我们必须通过对 ToInstant
的简单调用从对象中提取对象。Instant
ZonedDateTime
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。java.sql.*
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。