确定夏令时 (DST) 在 Java 中是否在指定日期处于活动状态tl;博士java.time关于 java.time

2022-08-31 13:47:48

我有一个Java类,它采用位置的纬度/经度,并在夏令时打开和关闭时返回GMT偏移量。我正在寻找一种简单的方法来确定Java中的当前日期是否为夏令时,以便我可以应用正确的偏移量。目前,我只对美国时区执行此计算,尽管最终我也想将其扩展到全球时区。


答案 1

这是要提出问题的机器的答案:

TimeZone.getDefault().inDaylightTime( new Date() );

尝试为客户端找出此问题的服务器将需要客户端的时区。请参阅@Powerlord答案以了解原因。

对于任何特定时区

TimeZone.getTimeZone( "US/Alaska").inDaylightTime( new Date() );

答案 2

tl;博士

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

这是现代java.time(参见教程)版本的正确答案通过mamboking

示例代码:

ZonedDateTime now = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
…
ZoneId z = now.getZone();
ZoneRules zoneRules = z.getRules();
Boolean isDst = zoneRules.isDaylightSavings( now.toInstant() );

请注意,在最后一行中,我们必须通过对 ToInstant 的简单调用从对象中提取对象。InstantZonedDateTime

Table of date-time types in Java, both modern and legacy.


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,如java.util.DateCalendarSimpleDateFormat

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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter


推荐