2015-08-26 16 views
8

Ho il seguente DateTimeFormatter.Visualizza nome fuso orario breve utilizzando DateTimeFormatter

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

Io lo utilizzo per formattare un ZonedDateTime come questo:

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

Vorrei che questo per ouput una stringa data formattata, come il seguente:

09/16/2015 alle 13:15:45 EDT

Ma ciò che sta ottenendo output è questo:

09/16/2015 a 01: 1 17:45 UTC + 05: 00

Non importa se io uso z, zz, zzz o zzzz nel modello, diventa sempre output nel formato di cui sopra.

C'è un modo diverso per creare il ZonedDateTime che mi darà l'output desiderato o sto facendo qualcosa di sbagliato nel modello?

Come per la DateTimeFormatterdocumentation, O dovrebbero essere utilizzati per visualizzare la zona localizzata-offset, come UTC-05:00, mentre z dovrebbero essere utilizzati per visualizzare il nome di fuso orario, come Eastern Daylight Time, o EDT.

risposta

6

Questo perché si utilizza un offset UTC anonimo. Prova con un nome ZoneId invece

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

stampe ("Ora dell'Africa orientale" è nomi localizzati italiani)

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

è possibile ottenere un elenco di nomi disponibili che dovrebbero usare per memorizzare e recuperare le preferenze dall'utente con

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

Ho usato 'ZoneId.of (" America/New_York ")' e mi ha dato il risultato desiderato. Grazie! –

+0

C'è un motivo per cui il pacchetto java.time non riconosce 'ZoneId.ofOffset (" UTC ", ZoneOffset.ofHours (-5))' è equivalente a 'ZoneId.of (" America/New_York ")'? O non sono equivalenti? –

+0

Ah, non importa. È perché 'ZoneId.ofOffset (" UTC ", ZoneOffset.ofHours (-5))' avrà sempre un offset UTC-05: 00, mentre "ZoneId.of (" America/New_York) "si alternerà tra UTC-05: 00 e UTC-04: 00, in base all'ora legale, quindi non sono equivalenti: ora ha senso –