【发布时间】:2019-05-30 14:41:35
【问题描述】:
我想按城市 UTC 和 GMT 时间不带下划线。首先,我正在写信以获取区域 ID:
List<String> utc = new ArrayList<>(ZoneId.getAvailableZoneIds());
List<String> gmt = new ArrayList<>(ZoneId.getAvailableZoneIds());
但我有下划线,我要改成空白:
List<String> newList_utc = new ArrayList<>();
List<String> newList_gmt = new ArrayList<>();
for (String anUtc : utc) {
if (anUtc.contains("_")) {
newList_utc.add(anUtc.replace("_", " "));
} else {
newList_utc.add(anUtc);
}
}
for (String aGmt : gmt) {
if (aGmt.contains("_")) {
newList_gmt.add(aGmt.replace("_", " "));
} else {
newList_gmt.add(aGmt);
}
}
拆分后我有特定的城市,例如-El Salvador。拆分和更改之前的格式是America/El_Salvador。
我正在使用以下代码输出带有偏移的时区:
newList_utc.stream().filter(it -> it.contains("El Salvador")).collect(Collectors.toList());
newList_utc.stream().filter(it -> it.contains("America/El Salvador")).map(Class::getOffset).collect(Collectors.toList());
...
...
private static String getOffset(String zone) {
ZonedDateTime zdt = LDT.atZone(ZoneId.of(zone));
return zdt.getOffset().getId().replace("Z", "+00:00");
}
最后,我得到了错误:
java.time.DateTimeException: Invalid ID for region-based ZoneId, invalid format: America/El Salvador
at java.time.ZoneRegion.checkName(ZoneRegion.java:151)
at java.time.ZoneRegion.ofId(ZoneRegion.java:116)
at java.time.ZoneId.of(ZoneId.java:411)
at java.time.ZoneId.of(ZoneId.java:359)
at project.Bot.getOffset(Bot.java:5822)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at project.Bot.getOutputZone(Bot.java:6070)
at project.Bot.getTimeZone(Bot.java:6041)
at project.Bot.onUpdateReceived(Bot.java:399)
在调试过程中,这是因为 getOffset()method 在这一行 ZonedDateTime zdt = LDT.atZone(ZoneId.of(zone)); 上我设置了 America/El Salvador。如果我写America/El_Salvador,那么我没有这个问题。
但是为什么我不能用空格代替下划线呢?
【问题讨论】:
-
ZoneID 由an external database 定义。如果用下划线定义,则需要下划线。
-
@Compass,哦,有道理。谢谢你。我想如果我改变它,我会得到另一个结果。