确定夏时制(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() );
请注意,在最后一行中,我们必须通过简单地调用toInstant
从ZonedDateTime
对象中提取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 )