Come faccio a visualizzare una data con un fuso orario personalizzato?
-
19-09-2019 - |
Domanda
Diciamo che ho una stringa che rappresenta una data che assomiglia a questo:
"mer 8 lug 17:08:48 GMT 2009"
Così ho parse che stringa in un oggetto data come questo:
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);
Questo mi dà l'oggetto data corretta. Ora voglio visualizzare questa data come un valore CDT.
Ho provato molte cose, e non riesco proprio a farlo funzionare correttamente. Ci deve essere un metodo semplice utilizzando la classe DateFormat per arrivare a questo lavoro. Qualche consiglio? Il mio ultimo tentativo è stato questo:
formatter.setTimeZone(toTimeZone);
String result = formatter.format(fromDate);
Soluzione
Con "zzz" invece di "ZZZ":. "Z" è il simbolo di un tempo RFC822 zona
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
Detto questo, il mio consiglio di serie su roba data / ora è quella di utilizzare Joda Tempo , che è un'API complessivamente migliore.
EDIT: programma breve ma completo:
import java.text.*;
import java.util.*;
public class Test
{
public List<String> names;
public static void main(String [] args)
throws Exception // Just for simplicity!
{
String fromDateString = "Wed Jul 08 17:08:48 GMT 2009";
DateFormat formatter = new SimpleDateFormat
("EEE MMM dd HH:mm:ss zzz yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);
TimeZone central = TimeZone.getTimeZone("America/Chicago");
formatter.setTimeZone(central);
System.out.println(formatter.format(fromDate));
}
}
Output: ven 8 lug 12:08:48 CDT 2009
Altri suggerimenti
Utilizzo:
formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));
uscite:
Wed Jul 08 12:08:48 CDT 2009
per la data nel tuo esempio sulla mia macchina. Cioè dopo aver sostituito zzz per ZZZ nella stringa di formato.
Ci scusiamo per scavare un vecchio-thread. Ma mi chiedevo se v'è un java-classe che contiene tutti i time-zone-id come classe costante. Così, invece di dover codificare il time-zone-id durante l'impostazione del fuso orario in questo modo:
formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));
ci sarebbe invece fare qualcosa di più standard / uniforme:
formatter.setTimeZone(TimeZone.getTimeZone(SomeConstantClass.US_CENTRAL));
dove SomeConstantClass.java è una classe che contiene le costanti relativi alle varie fuso orario-ID supportate dalla classe TimeZone.
Il modo moderno è con le classi java.time.
ZonedDateTime
Specifica uno schema di formattazione per abbinare il vostro stringa di input. I codici sono simili a SimpleDateFormat
ma non esattamente. Assicurarsi di leggere il doc classe per DateTimeFormatter
. Si noti che specifichiamo un Locale
per determinare ciò che il linguaggio umano da utilizzare per il nome del giorno della settimana e il nome del mese.
String input = "Wed Jul 08 17:08:48 GMT 2009";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu" , Locale.ENGLISH );
ZonedDateTime zdt = ZonedDateTime.parse ( input , f );
zdt.toString (): 2009-07-08T17: 08: 48Z [GMT]
Possiamo registrare che in qualsiasi altro fuso orario.
corretta oraria Nome nel formato continent/region
. Non usare mai il 3-4 lettera sigla come CDT
o EST
o IST
in quanto non sono fusi orari veri e propri, non standardizzati, e nemmeno unici (!).
Mi immagino che CDT
si intende un fuso orario come America/Chicago
.
ZoneId z = ZoneId.of( "America/Chicago" );
ZonedDateTime zdtChicago = zdt.withZoneSameInstant( z );
zdtChicago.toString () 2009-07-08T12: 08: 48-05: 00 [America / Chicago]
Instant
In generale meglio lavorare in UTC. Per questo estrarre un Instant
. Il Instant
classe rappresenta un momento sulla timeline in UTC con una risoluzione di nanosecondi (fino a nove (9) cifre di una frazione decimale).
Questa classe Instant
è una classe building-block di base del java.time. Si può pensare a ZonedDateTime
come Instant
più un ZoneId
.
Instant instant = zdtChicago.toInstant();
instant.toString (): 2009-07-08T17: 08: 48Z
A proposito di java.time
Il java.time quadro è integrato in Java 8 e versioni successive. Queste classi soppiantare la fastidiosi come java.util.Date
, .Calendar
, e java.text.SimpleDateFormat
.
Il Joda Time progetto, ora in modalità manutenzione , consiglia migrazione java.time.
Per ulteriori informazioni, vedere la Oracle Tutorial . E cercare Stack Overflow per molti esempi e spiegazioni. Le specifiche sono JSR 310 .
Dove ottenere le classi java.time?
- Java SE 8 e SE 9 e più tardi
- Built-in.
- Parte delle API Java standard con un'implementazione in bundle.
- Java 9 aggiunge alcune funzionalità minori e correzioni.
- Java SE 6 e SE 7
- La maggior parte delle funzionalità java.time è di back-porting per Java 6 & 7 a ThreeTen-Backport .
- Android
- Il ThreeTenABP si adatta progetto ThreeTen- backport (di cui sopra) per Android in particolare.
- Come utilizzare ... .
Il ThreeTen-Extra progetto java.time estende con classi aggiuntive. Questo progetto è un banco di prova per eventuali aggiunte future java.time. Si possono trovare alcune classi utili, come per esempio Interval
, YearWeek
, YearQuarter
, e informazioni .