Zobacz następujący fragment kodu:SimpleDateFormat zachowuje się niekonsekwentnie
String timeString = "1980-01-01T14:00:00+0300";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
Date date2 = sdf.parse(timeString);
// sdf.getCalendar().get(Calendar.ZONE_OFFSET);
System.out.println(sdf.format(date2));
Teraz jestem w kraju, który ma +2h
offsetu, +1
letniego (w tej chwili). Jeśli uruchomić ten kod, jak to jest, będzie drukować
1980-01-01T13:00:00+0200
Gdybym odkomentuj linię prośbą o kalendarz offset, wyjście programu jest
1980-01-01T14:00:00+0300
Każdy pomysł, dlaczego jest to, że dzieje i jak mogę uzyskać spójne wyniki?
Aby uniknąć bardziej niejasnych rzeczy: Ponieważ zajmuję się jakimś starszym kodem, java 8 nie jest opcją. I tak, kluczową kwestią jest DLACZEGO, a nie jakie są rozwiązania? i istnieją 2 why:
- Dlaczego zdać +0300 TZ i domyślnie otrzymam +0200 jeden? (SimpleDateFormat powinien zawsze używać TimeZone.getDefault, chyba że podano inaczej).
- Dlaczego daje inną odpowiedź tylko dlatego, że wywołuję gettera w jego instancji kalendarza.
co jest niespójne w tym? kiedy nie używasz przesunięcia, daje on datę taką, jaka jest, a kiedy jej używasz zmienia się zgodnie ze strefą czasową. –
@RamanShrivastava Wywołanie gettera nie powinno zmieniać wyjścia funkcji formatu. – wonderb0lt