Wie kann ich mit einer benutzerdefinierten Zeitzone ein Datum angezeigt werden?
-
19-09-2019 - |
Frage
Lassen Sie uns sagen ich eine Zeichenfolge, die ein Datum darstellt, das wie folgt aussieht:
"Mi 8. Juli 17.08.48 GMT 2009"
Also ich analysieren diese Zeichenfolge in ein Datum Objekt wie folgt:
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);
Das gibt mir die richtige Date-Objekt. Jetzt möchte ich als CDT-Wert dieses Datum angezeigt werden soll.
Ich habe viele Dinge ausprobiert, und ich kann einfach nicht bekommen es richtig zu arbeiten. Es muss eine einfache Methode, mit der Dateformat Klasse sein, dies zu erhalten, zu arbeiten. Irgendein Rat? Mein letzter Versuch war:
formatter.setTimeZone(toTimeZone);
String result = formatter.format(fromDate);
Lösung
Verwenden Sie "zzz" anstelle von "ZZZ":. "Z" ist das Symbol für eine RFC822 Zeitzone
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
Having said that, meine Standard-Beratung auf Datum / Uhrzeit Sachen ist Joda Zeit zu verwenden, das ist, eine insgesamt bessere API.
EDIT: Kurzes, aber vollständiges Programm:
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));
}
}
Ausgabe: Mi 8. Juli 12.08.48 CDT 2009
Andere Tipps
Mit:
formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));
Ausgänge:
Wed Jul 08 12:08:48 CDT 2009
für das Datum in Ihrem Beispiel auf meinem Rechner. Das ist nach zzz für ZZZ im Formatstring ersetzt wird.
Es tut uns Ausgraben einen alten Thread. Aber ich frage mich, ob es eine Java-Klasse, die die ganze Zeit-Zonen-IDs als konstante Klasse hält. Also anstatt zu hart Code, um die Zeitzone-ID während Zeitzone wie diese Einstellung:
formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));
würden wir stattdessen etwas mehr Standard / Uniform tun:
formatter.setTimeZone(TimeZone.getTimeZone(SomeConstantClass.US_CENTRAL));
wo SomeConstantClass.java ist eine Klasse, die Konstanten unter Bezugnahme auf den verschiedenen Zeitzonen-IDs, die von der Time-Zone-Klasse unterstützt werden hält.
Die moderne Art und Weise ist mit den java.time Klassen.
ZonedDateTime
Geben Sie eine Formatierung Muster Ihre Eingabezeichenfolge übereinstimmen. Die Codes sind ähnlich SimpleDateFormat
aber nicht genau. Achten Sie darauf, die Klasse doc für DateTimeFormatter
Locale
angeben, um festzustellen, welche Sprache die menschliche für Namen zu verwenden, der Tag-of-Woche und den Namen des Monats.
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]
Wir können das in eine andere Zeitzone anpassen.
Geben Sie eine rel="nofollow richtige Zeitzone Namen im Format continent/region
. Verwenden Sie niemals die 3-4 Buchstaben-Abkürzung wie CDT
oder EST
oder IST
, da sie nicht wahr Zeitzonen sind nicht standardisiert und nicht einmal eindeutig (!).
Ich denke, dass durch CDT
Sie eine Zeitzone wie America/Chicago
gemeint.
ZoneId z = ZoneId.of( "America/Chicago" );
ZonedDateTime zdtChicago = zdt.withZoneSameInstant( z );
zdtChicago.toString () 2009-07-08T12: 08: 48-05: 00 [America / Chicago]
Instant
Im Allgemeinen am besten in UTC zu arbeiten. Denn das eine Instant
extrahieren. Die Instant
Klasse stellt einen Moment auf die Timeline in UTC mit einer Auflösung von ns (bis zu neun (9) Stellen einer Dezimalbruch).
Diese Instant
Klasse ist eine Grundbaukasten Klasse von java.time. Sie können als ZonedDateTime
von Instant
denken plus ein ZoneId
.
Instant instant = zdtChicago.toInstant();
instant.toString (): 2009-07-08T17: 08: 48Z
Über java.time
Die java.time Rahmen in Java 8 und später gebaut. Diese Klassen verdrängen die störenden alten Vermächtnis Datum Zeitklassen rel="nofollow wie java.util.Date
, .Calendar
& java.text.SimpleDateFormat
.
Das Joda-Time Projekt nun in Wartungsmodus , rät Migration zu java.time.
Um mehr zu erfahren, finden Sie in der Oracle Tutorial . Und Stack-Überlauf suchen viele Beispiele und Erklärungen. Spezifikation JSR 310 .
Wo die java.time Klassen erhalten?
- Java SE 8 und SE 9 und später
- Built-in.
- Ein Teil des Standard-Java-API mit einer gebündelten Implementierung.
- Java 9 fügt einige kleinere Features und Korrekturen.
- Java SE 6 und SE 7
- Ein großer Teil der java.time Funktionalität zurückportiert zu Java 6 & 7 in ThreeTen-Backport .
- Android
- Die ThreeTenABP Projekt passt sich ThreeTen- Backport (oben erwähnt) für Android speziell.
- Siehe So verwenden ... .
Die ThreeTen-Extra Projekt erstreckt java.time mit zusätzlichen Klassen. Dieses Projekt ist eine Bewährungsprobe für eine mögliche zukünftige Ergänzungen java.time. Sie können einige nützliche Klassen hier wie Interval
YearWeek
, YearQuarter
und mehr .