2011-07-18 15 views
5

Jestem całkiem nowym użytkownikiem Javy i trochę utknąłem przy użyciu SimpleDateFormat i Calendar. Mam obiekt Date i chcę wyodrębnić datetime takie jak yyyy-MM-dd HH:mm:ss. Mieszkam w Niemczech i obecnie jesteśmy GMT +0200. Mój czas-obiekt czas jest na przykład 2011-07-18 13:00:00. Teraz potrzebuję 2011-07-18 11:00:00. Przesunięcie dla mojej strefy czasowej powinno być obliczane automatycznie.Konwersja GMT DateTime String

Próbowałem coś takiego, ale myślę, że tam gdzieś jest błąd:

private String toGmtString(Date date){ 
    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    TimeZone timeZone = TimeZone.getDefault(); 
    Calendar cal = Calendar.getInstance(new SimpleTimeZone(timeZone.getOffset(date.getTime()), "GMT")); 
    sd.setCalendar(cal); 
    return sd.format(date); 
} 

Na niektórych urządzeniach DateString jest zwracanych jak chcę go. Na innych urządzeniach przesunięcie nie jest obliczane prawidłowo, a datę i czas otrzymuję z obiektu danych wejściowych. Czy możesz udzielić mi wskazówek lub porad? Domyślam się, że mój sposób na pozbycie się domyślnej strefy czasowej nie działa?

Odpowiedz

5
private String toGmtString(Date date){ 
    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    sd.setTimeZone(TimeZone.getTimeZone("GMT")); 
    return sd.format(date); 
} 

Nie trzeba tworzyć nowego SimpleTimeZone, ponieważ nie jesteś wymyślając nową strefę czasową - istnieją 2 istniejących stref czasowych, które wchodzą w grę w swoim programie, GMT domyślny jeden.

Nie musisz także modyfikować istniejącego obiektu daty, ponieważ nie chcesz reprezentować innego punktu w czasie - potrzebujesz tylko innego sposobu wyświetlania tego samego punktu w czasie.

Wystarczy, że podasz SimpleDateFormat, której strefę czasową użyjesz podczas formatowania.

+0

Nie mogę uwierzyć, że to takie proste, ale oczywiście spróbuję. Daj mi kilka minut, proszę ... – Marco

+0

Ok .. Przetestowałem .. Użyłem obiektu daty, który reprezentuje '2011-07-18 13: 34: 27'. Używając domyślnej funkcji daty '.toGMTString()' Otrzymuję '18 lipca 2011 11:43:27 GMT', który jest dokładnym punktem w czasie, który potrzebuję. Korzystając z mojej własnej funkcji nadal otrzymuję' 2011-07-18 13: 43: 27 ", który był moim problemem. Korzystając z funkcji Jigara Joshina otrzymuję komunikat "2011-07-18 12: 43: 27", którego brakuje 1 godzina (europejski czas letni). Korzystając z funkcji Eli Acherkans, otrzymuję '2011-07-18 11: 43: 27', co jest dokładnie tym, czego chciałem (Offset z uwzględnieniem europejskiego lata). – Marco

+0

+1

2
private String toGmtString(Date date){ 
    //date formatter 
    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    //getting default timeZone 
    TimeZone timeZone = TimeZone.getDefault(); 
    //getting current time 
    Calendar cal = Calendar.getInstance() 
    cal.setTime(date) ; 
    //adding/substracting curren't timezone's offset 
    cal.add(Calendar.MILLISECOND, -1 * timeZone.getRawOffset());  
    //formatting and returning string of date 
    return sd.format(cal.getTime()); 
} 
+0

OK, to wygląda dobrze. Spróbuję w kilka minut. Jedno pytanie. Gdzie i jak użyłeś parametru date z wywołania funkcji ?! Czy po otrzymaniu instancji powinienem użyć 'cal.setTime (date);' – Marco

+0

tak dokładnie. zaktualizowałem to. –

+0

Nice! Prace! Dziękuję Ci bardzo! – Marco