我想按城市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()
的{{1}}这行上的ZonedDateTime zdt = LDT.atZone(ZoneId.of(zone));
方法而发生了。如果我写America/El Salvador
,那么我就不会遇到这个问题。
但是为什么我不能使用空格而不是下划线?
答案 0 :(得分:2)
时区ID实际上不是由Java标准定义的,而是在Java之外的称为tz database的数据集中定义的,该数据集是一种公共域时区标准,旨在实现应用程序和编程语言之间的互操作性。
时区名称背后的规则是:
时区以“区域/位置”的形式具有唯一的名称,例如“美国/纽约”。还选择使用英文名称或等效名称,并省略标点符号和通用后缀。 下划线字符代替空格。在位置名称中出现连字符的地方使用连字符。区域和位置名称的最大长度为14个字符。
因此,根据格式需要下划线,因此不能使用带空格的时区而不是下划线,这不是因为Java不支持它,而是因为没有匹配的tz项。
如果要从tz转换为纯净显示,可以将下划线替换为空格,反之亦然,以将纯净显示转换回时区ID。