Java 使用DateTimeFormatter显示短时区名称

Java 使用DateTimeFormatter显示短时区名称,java,java-8,java-time,Java,Java 8,Java Time,我有以下DateTimeFormatter DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("MM/dd/yyyy 'at' hh:mm:ss a zzzz"); 我正在使用它格式化一个ZoneDateTime,如下所示: ZonedDateTime disableTime = Instant.now() .plus(Duration.ofDays(21)) .at

我有以下
DateTimeFormatter

DateTimeFormatter DATE_TIME_FORMATTER = 
    DateTimeFormatter.ofPattern("MM/dd/yyyy 'at' hh:mm:ss a zzzz");
我正在使用它格式化一个
ZoneDateTime
,如下所示:

ZonedDateTime disableTime = Instant.now()
        .plus(Duration.ofDays(21))
        .atZone(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(-5)));
System.out.println(DATE_TIME_FORMATTER.format(disableTime));
我希望它输出格式化的日期字符串,如下所示:

2015年9月16日美国东部时间下午1:15:45 但获得输出的是:

2015年9月16日下午1:15:45 UTC-05:00 无论我在模式中使用
z
zz
zzz
,还是
zzzz
,它总是以上述格式输出

是否有一种不同的方法来创建
ZoneDateTime
,以提供所需的输出,或者我是否在模式中做了一些错误的事情


根据
DateTimeFormatter
O
应用于显示本地化的时区偏移量,如
UTC-05:00
,而
z
应用于显示时区名称,如
东部夏时制
,或
EDT
这是因为您使用了匿名的UTC偏移量。尝试使用命名的
区域ID

ZonedDateTime disableTime = Instant.now()
     .plus(Duration.ofDays(21))
     .atZone(ZoneId.of("Africa/Nairobi"));
印刷品(“Ora dell'Africa orientale”是意大利语本地化名称)

您可以获得可用名称的列表,这些名称应用于存储和检索用户的首选项

Set<String> ids = ZoneId.getAvailableZoneIds();
Set id=ZoneId.getAvailableZoneId();

我使用了(“美国/纽约”)分区,它给了我想要的结果。非常感谢。java.time包没有识别出时间偏移的分区(“UTC”,时间偏移的分区(-5))相当于时间偏移的分区(“美国/纽约”)有什么原因吗?或者它们不相等?啊,没关系。这是因为
ZoneId.of offset(“UTC”,ZoneOffset.of Hours(-5))
将始终有UTC-05:00偏移,而
ZoneId.of(“America/New__York)
将根据夏令时在UTC-05:00和UTC-04:00之间交替。因此它们并不相等。现在有意义。当然。此外,0、1或N个命名区域使用一个偏移
Set<String> ids = ZoneId.getAvailableZoneIds();