2013-08-13 18 views
6

W języku Java, jak przeanalizować "Śro, 05 czerwca 2013 00:48:12 GMT" w obiekt Date, a następnie wydrukować obiekt daty w tym samym formacie.Jak przeanalizować sformatowany obiekt String na datę w Javie

Próbowałem to:

String dStr= "Wed, 05 Jun 2013 00:48:12 GMT"; 
SimpleDateFormat ft = new SimpleDateFormat ("E, dd MMM yyyy hh:mm:ss ZZZ"); 
Date t = ft.parse(dStr); 
System.out.println(t); 
System.out.println(ft.format(t)); 

Rezultatem jest

Wed Jun 05 10:48:12 EST 2013 
Wed, 05 Jun 2013 10:48:12 +1000 

Z góry dzięki:

+0

Czy to naprawdę powoduje 10-godzinną różnicę, czy też ten tekst jest źle skopiowany? –

+0

@MartijnCourteaux Nie, wygląda na to, że po prostu wyświetla się w lokalnej strefie czasowej. –

+0

Ah, teraz widzę :) Mylę z +100 zamiast +1000. Która wciąż byłaby godzina ... –

Odpowiedz

1

To rozwiązuje problem:

import java.text.*; 
import java.util.*; 

public class DateIt{ 
    public static void main(String [] args) throws Exception{ 
     String dStr= "Wed, 05 Jun 2013 00:48:12 GMT"; 
     SimpleDateFormat ft = new SimpleDateFormat ("E, dd MMM yyyy HH:mm:ss z"); 
     Date t = ft.parse(dStr); 
     TimeZone gmt = TimeZone.getTimeZone("England/London"); 
     ft.setTimeZone(gmt); 
     System.out.println(t); 
     System.out.println(ft.format(t)); 
     } 
} 
+0

dziękuję, używam twojego kodu, ale wynikiem jest "Śro, 05 czerwca 2013 12:48:12 GMT", który różni się od ciągu wejściowego "Środa, 05 czerwca 2013 00:48:12 GMT" Wszelkie dalsze sugestie tutaj? – user1304846

+0

Czy wiersz 7 ma "HH" zamiast "hh"? "HH" zwróci czas w notacji 24-godzinnej. – Clocks

+0

masz rację, użyłem "hh", po tym, jak zmieniłem go na "HH", wtedy wszystko działa dobrze. Wielkie dzięki. – user1304846

1

Wygląda jak chcesz zzz zamiast ZZZ. To powinno pomóc Ci odczytać/zapisać strefę czasową jako kod, a nie numer.

4

Nie masz błędu, oba: Wed, 05 Jun 2013 00:48:12 GMT i Wed, 05 Jun 2013 00:48:12 GMT reprezentują ten sam czas, pierwszy to GMT (Grenweech), a drugi jest w tym samym czasie w Australii (EST), wystarczy skonfigurować strefa czasowa prawidłowo.

Jeśli chcesz wydrukować tę samą datę w GMT dodać tę linię do kodu:

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

Teraz, jeśli chcesz data mają być drukowane z strefy czasowej jako „GMT” zamiast z "+0000" obserwacji @HewWolff odpowiedzieć (use zzz zamiast zZZ)

+0

Pytanie brzmi: czy PO chce wydrukować, aby użyć strefę czasową z oryginalnego ciągu wejściowego lub użyć ustalonej strefy czasowej (takiej jak GMT)? Przypuszczam, że [setTimeZone] (http://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html#setTimeZone%28java.util.TimeZone%29) jest prawdopodobnie częścią rozwiązania, ale najpierw musimy znać dokładny problem. –

+0

Oczywiście te dwa ciągi reprezentują ten sam czas - są identyczne ... – DannyMo

+0

@Mattias Buelens, zamierzam wyprowadzić oryginalny ciąg wejściowy w ustalonej strefie czasowej (takiej jak GMT), jaki powinien być wzór daty i czasu tutaj. Oczekiwany wynik powinien być taki sam jak "Środa, 05 czerwca 2013 00:48:12 GMT". Dzięki. – user1304846

0

ugh - Zabrakło mi do tego problemu wcześniej.

Metoda SimpleDateFormat.parse(String) (podejrzewam) używa instancji Calendar. Ma to znaczenie z dwóch powodów:

  1. Nie wiem jaki smak Kalendarz masz do czynienia z (Vegan gregoriański Majów??).
  2. Kalendarz inicjuje swoje pola za pomocą domyślnych wartości , których nie trzeba ustawiać. Kiedy SimpleDateFormat wywołuje metodę getTime() w instancji Kalendarza, która utworzyła w celu zwrócenia daty, ta data będzie miała domyślne wartości pól, które nie są oznaczone przez ciąg, który wysłałeś.

Te wartości domyślne mają wpływ na wywołanie ft.format(t). Jedynym sposobem rozwiązania tego problemu, który znalazłem, jest bezpośrednia praca z klasą kalendarza (co jest całkowicie nietrywialne, BTW). Postaram się dostarczyć przykładowy kod później, gdy będę mieć więcej czasu. W międzyczasie spójrz na javafx.util.converter.DateStringConverter.

Powiązane problemy