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

确定指定日期的夏令时(DST)是否在Java中处于活动状态,java,dst,datetimeoffset,Java,Dst,Datetimeoffset,我有一个Java类,它接受一个位置的纬度/经度,并在夏令时打开和关闭时返回GMT偏移量。我正在寻找一种用Java确定当前日期是否在夏令时的简单方法,以便应用正确的偏移量。目前,我只对美国时区执行此计算,但最终我想将其扩展到全球时区。这是问题所在机器的答案: TimeZone.getDefault().inDaylightTime( new Date() ); 服务器试图为客户机找出这个问题,需要客户机的时区。有关原因,请参见@Powerlord-answer 适用于任何特定时区 TimeZon

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

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

TimeZone.getDefault().inDaylightTime( new Date() );
服务器试图为客户机找出这个问题,需要客户机的时区。有关原因,请参见@Powerlord-answer

适用于任何特定时区

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

你必须用这些坐标做更多的工作,找出它们在哪个时区。一旦知道了时区,isDayLight()方法将非常有用

例如,您无法判断-0500是否为EST(美国/加拿大东部标准时间)、CDT(美国/加拿大中部夏时制)、COT(哥伦比亚时间)、AST(巴西英亩标准时间)、ECT(厄瓜多尔时间)等

其中一些可能支持夏令时,也可能不支持夏令时。

包含将为您计算偏移的处理方法。看

作为补充,您需要使用纬度/经度信息查找当前时区。为其web服务提供java客户端,以及一个简单的web请求框架(即)

tl;博士 java.time 这是by的现代版本(参见)

  • A代表一个时区。该类知道判断是否适用的规则
  • 该类为时区的所有历史和未来转换建模
  • 时间轴上的一个瞬间
  • A是将
    区域ID
    应用于
    即时
    的结果
示例代码:

ZonedDateTime now = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
…
ZoneId z = now.getZone();
ZoneRules zoneRules = z.getRules();
Boolean isDst = zoneRules.isDaylightSavings( now.toInstant() );
请注意,在最后一行中,我们必须通过对的简单调用从
ZonedDateTime
对象中提取一个
Instant
对象


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(目前我正在使用GeoTools库和美国国家地图集提供的shapefile()检索时区信息。幸运的是,这为我提供了一些附加信息-主要是2或4位的时区符号(即AL、EA、EAno等)。不幸的是,虽然我可以手动执行此映射,但此值与Java时区使用的值不一致。理想情况下,如果我将此文件替换为世界时区形状文件,我希望找到一个可行的解决方案,但这可能太过雄心勃勃。timeznp020.txt列出了
      枚举的\u域
      s,其中包括每个abbr的详细信息使用EVION;将它们映射到zoneinfo时区名称应该不会太困难。我不确定Java中的时区名称是否跨平台,但我希望如此!另一个对这个问题有用的答案是我以前研究过GeoNames web服务,我知道它将完成我正在尝试的工作。不幸的是,这段代码我将托管在可能位于防火墙后面的服务器上,因此如果可能的话,我会尽量避免外部web服务调用。对于那些没有此限制的用户,GeoNames web服务将是一个很好的解决方案。我一直在解决同一问题。我还没有找到世界时区的形状文件。我们不知道这是否是一个桌面应用程序或者一个web应用程序。web应用程序无法访问客户端上的时区信息。Android:需要API级别243。应避免使用EST(表示标准时间)等更高版本的缩写,因为它们不受DST的影响。请改用时区id。
      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.
      
      ZonedDateTime now = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
      …
      ZoneId z = now.getZone();
      ZoneRules zoneRules = z.getRules();
      Boolean isDst = zoneRules.isDaylightSavings( now.toInstant() );