确定指定日期的Java夏令时(DST)是否处于活动状态

Determine Whether Daylight Savings Time (DST) is Active in Java for a Specified Date

我有一个Java类,它占用一个位置的纬度/经度,并在夏时制开启和关闭时返回GMT偏移量。我正在寻找一个简单的方法来确定Java如果当前日期是在夏令时间,所以我可以应用正确的偏移量。目前,我只对美国时区进行这种计算,尽管最终我希望将其扩展到全球时区。


这是问题所在机器的答案:

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

试图为客户机解决这个问题的服务器需要客户机的时区。请参阅@powerlord answer了解原因。

对于任何特定时区

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


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() );

注意,在最后一行中,我们必须通过简单调用toInstantZonedDateTime对象中提取Instant对象。

关于JavaTimes

JavaTimeFr框架是在Java 8和之后构建的。这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的joda time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。以及搜索堆栈溢出以获得许多示例和解释。规格为JSR 310。

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要java.sql.*类。

在哪里获取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的一个试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。


1
2
TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());


你需要用这些坐标做更多的工作,找出它们在哪个时区。一旦知道了哪个时区,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)