确定指定日期的夏令时(DST)是否在Java中处于活动状态
我有一个Java类,它接受一个位置的纬度/经度,并在夏令时打开和关闭时返回GMT偏移量。我正在寻找一种用Java确定当前日期是否在夏令时的简单方法,以便应用正确的偏移量。目前,我只对美国时区执行此计算,但最终我想将其扩展到全球时区。这是问题所在机器的答案:确定指定日期的夏令时(DST)是否在Java中处于活动状态,java,dst,datetimeoffset,Java,Dst,Datetimeoffset,我有一个Java类,它接受一个位置的纬度/经度,并在夏令时打开和关闭时返回GMT偏移量。我正在寻找一种用Java确定当前日期是否在夏令时的简单方法,以便应用正确的偏移量。目前,我只对美国时区执行此计算,但最终我想将其扩展到全球时区。这是问题所在机器的答案: TimeZone.getDefault().inDaylightTime( new Date() ); 服务器试图为客户机找出这个问题,需要客户机的时区。有关原因,请参见@Powerlord-answer 适用于任何特定时区 TimeZon
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列出了
s,其中包括每个abbr的详细信息使用EVION;将它们映射到zoneinfo时区名称应该不会太困难。我不确定Java中的时区名称是否跨平台,但我希望如此!另一个对这个问题有用的答案是我以前研究过GeoNames web服务,我知道它将完成我正在尝试的工作。不幸的是,这段代码我将托管在可能位于防火墙后面的服务器上,因此如果可能的话,我会尽量避免外部web服务调用。对于那些没有此限制的用户,GeoNames web服务将是一个很好的解决方案。我一直在解决同一问题。我还没有找到世界时区的形状文件。我们不知道这是否是一个桌面应用程序或者一个web应用程序。web应用程序无法访问客户端上的时区信息。Android:需要API级别243。应避免使用EST(表示标准时间)等更高版本的缩写,因为它们不受DST的影响。请改用时区id。枚举的\u域
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() );