2015-08-26 1 views
8

У меня есть DateTimeFormatter.Показывать короткое имя часового пояса, используя DateTimeFormatter

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

Я использую его для форматирования ZonedDateTime так:

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

Я хотел бы, чтобы это Ouput отформатированной строки даты, как показано на следующем:

09/16/2015 в 1:15:45 PM EDT

Но что получает выход заключается в следующем:

09/16/2015 в 01: 1 5:45 вечера UTC-05: 00

Независимо от того, используют ли я z, zz, zzz или zzzz в шаблоне, он всегда получает выход в вышеуказанном формате.

Есть ли другой способ создать ZonedDateTime, который даст мне желаемый результат, или я делаю что-то неправильно в шаблоне?

В соответствии с DateTimeFormatterdocumentation, O должен быть использован для отображения локализованной зоны смещения, например, UTC-05:00, в то время как z следует использовать для отображения имени часового пояса, таких как Eastern Daylight Time или EDT.

ответ

6

Это потому, что вы используете анонимное смещение UTC. Попробуйте с именем ZoneId вместо

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

печатает («Ora dell'Africa восточный» итальянский локализованные имена)

09/16/2015 at 09:34:44 PM Ora dell'Africa orientale 

Вы можете получить список доступных имен, которые следует использовать для хранения и получить предпочтения от пользователя с помощью

Set<String> ids = ZoneId.getAvailableZoneIds(); 
+0

Я использовал 'ZoneId.of (« America/New_York »)', и это дало мне желаемый результат. Спасибо! –

+0

Есть ли причина, по которой пакет java.time не распознает 'ZoneId.ofOffset (« UTC », ZoneOffset.ofHours (-5))' эквивалентно 'ZoneId.of (« Америка/Новый_York »)'? Или они не эквивалентны? –

+0

Ах, неважно. Это потому, что 'ZoneId.ofOffset (« UTC », ZoneOffset.ofHours (-5))' всегда будет иметь смещение UTC-05: 00, в то время как 'ZoneId.of (« America/New_York ») будет чередоваться между UTC-05: 00 и UTC-04: 00, в зависимости от летнего времени, поэтому они не эквивалентны. Теперь имеет смысл. –