2016-05-02 4 views
-1

Ich versuche, eine Zeichenfolge wieConvert Datum String Mon 30. März 13.51.35 UTC 2015 Date-Objekt

String dateString = "Mon Mar 30 13:51:35 UTC 2015"; 

in einem Date-Objekt zu konvertieren.

Ich versuchte dies:

DateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy", Locale.ENGLISH); 
    sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
    System.out.println("Date Object:"+sdf.parse(dateString)); 

Aber der Ausgang des Objekts Datum ist

Mon Mar 30 15:51:35 CEST 2015 

wie Sie sehen können: 1) leitet er die Zeit der Zeichenfolge vor bis zwei Stunden 2) es ändert sich UTC -> CEST

Ich habe viele Lösungen versucht, aber nichts hat funktioniert. Was ist der richtige Weg, dies zu tun?

EDIT: Mein Ziel ist es, ein Date-Objekt aus diesem ursprünglichen String zu haben. Dieses Date-Objekt sollte dieselben Parameter wie die Datumszeichenfolge haben. In diesem Fall werden die ursprünglichen Stunden des Tages (13) auf 15 gestellt, aber das gewünschte ist, dass es bei 13 bleibt. Ich brauche das, weil ich in meinem Programm zwei verschiedene Datumsobjekte vergleichen muss.

BEARBEITEN: JAVA 8 LÖSUNG Auf der Suche nach den jüngeren Java 8 fand ich eine bessere und elegantere Lösung. Hier ist der Code

String pattern = "EEE MMM dd HH:mm:ss SSS zzz yyyy"; 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern, Locale.UK).withZone(ZoneId.of("UTC")); 
final ZonedDateTime parsed = ZonedDateTime.parse(dateString, formatter); 

Darüber hinaus ist es zu vergleichen, zum Beispiel die aktuelle Zeit:

ZonedDateTime now = ZonedDateTime.now(); 

     int compared = parsed.compareTo(now); 

     System.out.println("NOW:"+now.toLocalDateTime()+" PARSED:"+parsed.toLocalDateTime()+" COMPARED:"+compared); 
+0

Wo befinden Sie sich? Das scheint mir das selbe Datum zu sein. –

+4

Denken Sie daran, dass ein Datum kein Format hat. –

+1

Ich glaube nicht, dass Sie verstehen, dass ein Datum ein Zeitstempel ist. Es ist eine Momentaufnahme, egal zu welcher Zeit es war. Es ist die gleiche Zeit, wo ich jetzt in Kalifornien bin, wo du in CEST bist (oder wo auch immer). Wenn ich hier ein "Date" -Objekt erstellt habe und eines dort erstellt habe, würden sie immer noch die gleiche Zeit repräsentieren und einander "gleich" sein. –

Antwort

-1

Statt UTC, GMT verwenden, wenn die Zeitzone zu bekommen. richtig

sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 

Source

1

Sie es tun. Das Datum wird korrekt analysiert. Sie drucken das Datum nur in die Zeitzone Ihres lokalen Computers. Wenn Sie toString() auf ein Datum anwenden, wird das Datum in der Zeitzone Ihres lokalen Rechners gedruckt.

Mo 30. März 15.51.35 CEST 2015 == Mo 30. März 13.51.35 UTC 2015

CEST UTC +2

-1

Sie haben bereits die Date Objekt. Wenn Sie es in gewünschte Format drucken möchten, können Sie DateFormat verwenden, um die Date Objekt format auch:

Date date = sdf.parse(dateString); 
System.out.println("Date Object:"+sdf.format(date)); 
// Use the date object ... 
+0

Obwohl sicher, das wird drucken, was sie wollen, ist es völlig sinnlos. Drucken Sie einfach den 'dateString' direkt. 'sdf.format (sdf.parse (was auch immer))' ist mehr oder weniger ein No-Op. –

+0

@SotiriosDelimanolis Sie haben Recht, aber die Idee ist, die Methode zu zeigen, nach der er suchen könnte. – dejvuth

+0

Warum sollten sie nach einem No-Op suchen? –

0

A java.util.Date keine Zeitzone haben, praktisch gesprochen. Es gibt zwar eine Zeitzone, aber sie kann weder eingestellt noch abgerufen werden. Eine von vielen schlechten Design-Entscheidungen, die in diesen alten Datum-Zeit-Klassen getroffen wurden.

Die Methode Date::toString wendet die aktuelle Standardzeitzone Ihres JVM beim Generieren der Ausgabezeichenfolge an. Fertig mit guten Absichten, aber nicht hilfreich, da es die Illusion erzeugt, dass sich Ihr Date-Objekt in dieser Zone befindet, obwohl dies in Wirklichkeit nicht der Fall ist.

java.Zeit

Sie verwenden eine problematische alte Legacy-Klasse, jetzt ersetzt durch das java.time-Framework in Java 8 und später integriert.

Konvertieren von einem Date zu einem Instant, ein Moment auf der Timeline in UTC mit einer Auflösung von Nanosekunden.

Instant instant = myJavaUtilDate.toInstant(); 

Anruf toString. Die java.time-Klassen verwenden Standard-ISO-8601-Formate beim Parsen/Erzeugen von Strings.

String output = instant.toString(); 

Strings zu erstellen, konvertieren Instant-OffsetDateTime die Konstante ZoneOffset.UTC verwenden. Arbeiten Sie anschließend mit den Klassen java.time.format, um die Zeichenfolge zu generieren.

OffsetDateTime odt = OffsetDateTime.ofInstant(instant , ZoneOffset.UTC); 

Suche Stack Overflow für weitere Informationen und Beispiele. Diese Probleme haben bereits hunderte Male angesprochen.

+0

Vielen Dank. Ich hätte nach einem moderneren Weg suchen sollen, und das Projekt wird auch mit einem jdk 8 entwickelt. – DavideS