在这个ZoneId到UTC时间的预期时间内找到ZoneId的最佳方法是什么?
例如,
目前在世界协调时的时间:
2021-10-22T11:40:37.808Z
需要找到任何ZoneId,ZoneId中的当前时间应该是:
17
17-11 =6
因此,我们正在寻找任何ZoneId,它有:
UTC+06:00
例如,它是:
亚洲/喀什(UTC+06:00)
发布于 2021-10-22 12:01:55
您可以获得所有的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, ...}如果您真的想要一个给定偏移量的所有ZoneId,您可以稍微修改上面的代码,以返回一个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]发布于 2021-10-22 16:32:20
你说过:
因此,我们正在寻找任何ZoneId,其中有: UTC+06:00
时区使用的偏移量随时间而变化.这就是时区的定义:过去、现在和未来的历史--对某一特定地区的人民根据其政治家的决定所使用的抵消所作的改变。
因此,我们必须指定一个时刻,一个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() )
;亚洲/喀什,Etc/GMT-6,亚洲/阿拉木图,亚洲/达卡,亚洲/Omsk,亚洲/达卡,印度/查戈斯,亚洲/齐齐尔达,亚洲/比什凯克,南极洲/东方,亚洲/乌鲁木齐,亚洲/廷布,亚洲/廷布
https://stackoverflow.com/questions/69676453
复制相似问题