2014-07-07 8 views
5

Próbuję przekonwertować datę sformatowaną w formacie UTC na obiekt daty, który kończy się konwersją wyłączoną o kilka minut.Niepoprawne parsowanie ciągów dat w SimpleDateFormat

SimpleDateFormat fullDateFormater = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS", Locale.US); 
fullDateFormater.setTimeZone(TimeZone.getTimeZone("UTC")); 

przed analizą ciąg dat jest - 2014-07-07T18:24:23.788810

Po Przetwarzanie data jest Tue Jul 08 00:07:31 GMT+05:30 2014

data poprawna konwersja jest Tue Jul 07 23:54:23 GMT+05:30 2014

Istnieje różnica około 12-13 minut w konwersja. Zaobserwowałem różnicę w zakresie 10 minut w konwersji.

Każdy pomysł, co dzieje się nie tak?

+0

jakie jest twoje wejście Data string –

Odpowiedz

12

SSSSSS parsuje liczbę milisekund - nie mikrosekund, jak się spodziewasz.

788810 milisekund to 13 minut, 8 sekund i 810 milisekund. Twój wynik to faktycznie 2014-07-07T18: 27: 31.810.

Tak, to naprawdę głupi kawałek projektu interfejsu API. Byłoby dużo więcej sensu dla S...S oznacza „ułamku sekundy” zamiast „ms” - ale to daleko od najgorsze pre-Java-8 Date/Time API :(

I don 't think jest sposób na parsowanie mikrosekund z SimpleDateFormat - precyzja API czasu Java pre-Java-8 to milisekundy - więc myślę, że wystarczy odciąć trzy ostatnie cyfry za pomocą substring i przeanalizować je za pomocą SSS na końcu łańcucha formatu:

Jeśli używasz środowiska Java 8, zdecydowanie zachęcam Cię do skorzystania z usługi java.time, która na pewno może obsłużyć tę sytuację. (Nie patrzyłem na jego parsujący API, ale jestem pewien, że będzie dobrze.)

+0

Dzięki! Prawie pamiętałem, że już wcześniej miałem do czynienia z tym problemem. Upuściłem tylko część milisekundową. Nie korzystam jeszcze z Java 8. Dziękuję za "java.time". –

+0

Rzeczywiście API parsowania 'java.time' jest w porządku i poprawnie obsługuje" ułamki sekundy "(cyfry od 0 do 9) zamiast" milisekund ". Gorąco go polecam. Spójrz na klasę 'DateTimeFormatter'. –

Powiązane problemy