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);
War es hilfreich?

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 . Beachten Sie, dass wir eine 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?

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top