确定夏时制(DST)是否在Java中针对指定date处于活动状态

我有一个Java类,获取一个位置的纬度/经度,并在夏令时开启和closures时返回GMT偏移量。 我正在寻找一种简单的方法来确定在Java中,如果当前date是在夏令时,所以我可以应用正确的偏移量。 目前我只对美国时区进行这种计算,尽pipe最终我想将其扩展到全球时区。

这是问题被问到的机器的答案:

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

试图找出客户端的服务器将需要客户端的时区。 请参阅@Powerlord回答为什么。

对于任何特定的时区

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

TL;博士

 ZoneId.of( "America/Montreal" ) .getRules() .isDaylightSavings( Instant.now() ) 

java.time

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

  • ZoneId代表时区。 class级知道如果DST适用于特定时区的规则 。
  • ZoneRules类为一个时区模拟所有历史和未来的转换。
  • Instant是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() ); 

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

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

你将不得不做更多的工作,使用这些坐标,并找出他们在哪个时区。一旦你知道是哪个时区,isDayLight()方法将是有用的。

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

其中一些可能会或可能不支持夏令时。

乔达时间包含处理方法,将为您计算抵消。 请参阅DateTimeZone.convertLocalToUTC(…)

为了补充这一点,您将需要使用纬度/经度信息查找当前时区。 GeoNames为其Web服务提供了一个Java客户端,以及一个简单的Web请求框架(即http://ws.geonames.org/timezone?lat=47.01&lng=10.2