按当前时间在该区域查找ZoneId



按ZoneId到UTC时间的预期小时数查找ZoneId的最佳方法是什么?

例如,

当前UTC时间:
2018-10-22 t11:40:37 .808 z

需要找到任何ZoneId,其中ZoneId中的当前小时数将为:
17

17-11 = 6
所以我们正在寻找任何ZoneId,它具有:
UTC+06:00

例如:
Asia/Kashgar (UTC+06:00)

可以得到所有的ZoneId和相应的偏移量

import java.time.*;
import java.util.*;
class Main {  
public static void main(String args[]) { 
System.out.println(zoneIdToOffsetMap()); 
}
private static Map<String, String> zoneIdToOffsetMap() {
Map<String, String> result = new HashMap<>();
LocalDateTime localDateTime = LocalDateTime.now();
for (String zoneId : ZoneId.getAvailableZoneIds()) {
ZoneId id = ZoneId.of(zoneId);
// LocalDateTime -> ZonedDateTime
ZonedDateTime zonedDateTime = localDateTime.atZone(id);
// ZonedDateTime -> ZoneOffset
ZoneOffset zoneOffset = zonedDateTime.getOffset();
//replace Z to +00:00
String offset = zoneOffset.getId().replaceAll("Z", "+00:00");
result.put(id.toString(), offset);
}
return result;
}
}

打印如下映射:

{Asia/Aden=+03:00, America/Cuiaba=-04:00, ...}

如果您真的想要给定偏移量的所有ZoneIds,您可以稍微更改上面的代码,以便为单个偏移量返回String -> List<String>的映射或仅返回List<String>,如下所示。

private static List<String> getZoneIds(String target) {
List<String> zoneIds = new ArrayList<>();
LocalDateTime localDateTime = LocalDateTime.now();
for (String zoneId : ZoneId.getAvailableZoneIds()) {
ZoneId id = ZoneId.of(zoneId);
// LocalDateTime -> ZonedDateTime
ZonedDateTime zonedDateTime = localDateTime.atZone(id);
// ZonedDateTime -> ZoneOffset
ZoneOffset zoneOffset = zonedDateTime.getOffset();
//replace Z to +00:00
String offset = zoneOffset.getId().replaceAll("Z", "+00:00");
if (offset.equals(target)) {
zoneIds.add(id.toString());
}
}
return zoneIds;
}
}

这个打印:

[Asia/Kashgar, Etc/GMT-6, Asia/Almaty, Asia/Dacca, Asia/Omsk, Asia/Dhaka, Indian/Chagos, Asia/Qostanay, Asia/Bishkek, Antarctica/Vostok, Asia/Urumqi, Asia/Thimbu, Asia/Thimphu]

你说:

所以我们正在寻找任何ZoneId,它具有:UTC + 06:00时

时区所使用的utc偏移量随时间而变化。这就是时区的定义:由政治家决定的某一特定地区人民所使用的偏移时间的过去、现在和未来变化的历史。

所以我们必须指定一个时刻,一个Instant,我们想知道当前有效的偏移量

在下面的代码中,我们使用一个流来考虑所有时区。对于每个时区,我们获取其规则集,即要抵消的更改历史。我们在这些规则中查询在我们选择的时刻使用的偏移量。对于返回的偏移量,比较它是否是我们想要的偏移量。

Instant instant = Instant.now() ;
ZoneOffset targetOffset = ZoneOffset.ofHours( 6 ) ;
List< ZoneId > zonesUsingDesiredOffset = 
ZoneId
.getAvailableZoneIds()  // Returns a `Set` of `String` objects, the names of each known time zone.
.stream()
.map( zoneName -> ZoneId.of( zoneName ) )  // Map each zone name to `ZoneId` object.
.filter(
zoneId -> zoneId.getRules().getOffset( instant ).equals( targetOffset )  // Filter for zones whose offset at specified moment matches our desired offset.
)
.collect( Collectors.toList() )
;

查看此代码运行在IdeOne.com。

[亚洲/喀什,等/GMT-6,亚洲/阿拉木图,亚洲/达卡,亚洲/鄂木斯克,亚洲/达卡,印度/查戈斯,亚洲/齐洛尔达,亚洲/比什凯克,南极洲/沃斯托克,亚洲/乌鲁木齐,亚洲/廷布,亚洲/廷布]

最新更新