使用DateTimeFormatter显示短时区名称

And*_*ose 10 java java-8 java-time

我有以下内容DateTimeFormatter.

DateTimeFormatter DATE_TIME_FORMATTER = 
    DateTimeFormatter.ofPattern("MM/dd/yyyy 'at' hh:mm:ss a zzzz");
Run Code Online (Sandbox Code Playgroud)

我用它来格式化ZonedDateTime这样:

ZonedDateTime disableTime = Instant.now()
        .plus(Duration.ofDays(21))
        .atZone(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(-5)));
System.out.println(DATE_TIME_FORMATTER.format(disableTime));
Run Code Online (Sandbox Code Playgroud)

我希望这能输出格式化的日期字符串,如下所示:

2015年9月16日美国东部时间下午01:15:45

但是获得输出的是:

2015年9月16日下午01:15:45 UTC-05:00

无论我是否使用z,zz,zzz,或zzzz在模式,它总是在得到上面的格式输出.

是否有不同的方式来创建ZonedDateTime将给我所需的输出,或者我在模式中做错了什么?

根据DateTimeFormatter 文档,O应该用于显示本地化的区域偏移量,例如UTC-05:00,z应该用于显示时区名称,例如Eastern Daylight Time,或EDT.

Raf*_*ele 6

这是因为您使用匿名UTC偏移量.与命名尝试ZoneId,而不是

ZonedDateTime disableTime = Instant.now()
     .plus(Duration.ofDays(21))
     .atZone(ZoneId.of("Africa/Nairobi"));
Run Code Online (Sandbox Code Playgroud)

打印(" Ora dell'Africa orientale "是意大利本地化名称)

09/16/2015 at 09:34:44 PM Ora dell'Africa orientale
Run Code Online (Sandbox Code Playgroud)

您可以获取用于存储和检索用户首选项的可用名称列表

Set<String> ids = ZoneId.getAvailableZoneIds();
Run Code Online (Sandbox Code Playgroud)

  • 啊没关系。这是因为 `ZoneId.ofOffset("UTC", ZoneOffset.ofHours(-5))` 将始终具有 UTC-05:00 偏移量,而 `ZoneId.of("America/New_York)` 将在 UTC-05 之间交替: 00 和 UTC-04:00,基于夏令时。所以它们不相等。现在有意义了。 (2认同)