2014-10-16 26 views
6

Potrzebuję parsować ciąg na bieżąco w java. Mój ciąg ma następujący format:Parsowanie ciągów do tej pory: Nielegalny wzór znaku "T".

2014-09-17T12:00:44.0000000Z 

ale java rzuca następujący wyjątek podczas próby analizowania takiego formatu ... java.lang.IllegalArgumentException: Illegal pattern character 'T'.

Jakieś pomysły, jak to przeanalizować?

Dziękujemy!

+3

Jak analizować? –

+1

current_date = formatter.parse (data) – mbezunartea

+0

Dodaj obiekt formatowania również tutaj –

Odpowiedz

12

Biorąc pod uwagę twój wkład 2014-09-17T12:00:44.0000000Z, nie jest wystarczająca, aby uciec tylko nas T. Musisz także obsługiwać ciąg dalszy Z. Ale należy pamiętać, że ten Z NIE jest dosłowny, ale ma znaczenie przesunięcia strefy czasowej UTC+00:00 zgodnie z ISO-8601-standard. Tak więc uniknięcie Z NIE jest poprawne.

SimpleDateFormat obsługuje ten specjalny znak Z według symbolu wzoru X. Więc ostateczne rozwiązanie wygląda następująco:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSX"); 
Date d = sdf.parse("2014-09-17T12:00:44.0000000Z"); 
System.out.println(d); // output: Wed Sep 17 14:00:44 CEST 2014 

Należy zauważyć, że inny zegar jest dla strefy czasowej CEST (toString() używa strefy czasowej systemu), a wynik jest równoważna UTC-time 12:00:44. Ponadto musiałem wstawić siedem symboli S, aby poprawnie przetworzyć dane wejściowe, które udają, że mają dokładność do 100ns (chociaż Java 8 może przetwarzać tylko milisekundy).

+0

ale jeden komentarz, musisz zastąpić ostatnią literę X przez "Z" w konstruktorze SimpleDateFormat. Dobre rozwiązanie, zadziałało dla mnie –

+0

@VictorPonomarenko Litera X została wprowadzona z Java 7. Dla Java 6, nie jestem pewien, czy Z działa jako zamiennik, jeśli parsowane literały "Z" będą rozpoznawane jako UTC + 00! Być może lepiej jest użyć obejścia dla Java 6, aby uciec Z (interpretując to tylko jako literalne) I ustawić strefę na "GMT" na obiekcie 'SimpleDateFormat'. –

+0

na Android dostaję wyjątek runtime, gdy zostawię znak X, ale po zamianie na 'Z' działa dobrze (Android działa teraz na java 7) –

7

Musisz uciec 'T' znak:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US); 
    format.setTimeZone(TimeZone.getTimeZone("UTC")); 
    Date parse = format.parse("2014-09-17T12:00:44.0000000Z"); 

Korzystanie odpowiedzi do: What is this date format? 2011-08-12T20:17:46.384Z

+0

Dzięki za odpowiedź, teraz nie otrzymuję tego samego wyjątku, ale ten: "java.text.ParseException: Nie można oddzielić daty:" Data "". Myślę, że format daty nie jest jeszcze dobrze zdefiniowany ... – mbezunartea

1

Spróbuj tego.

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class DateClass { 
    public static void main(String[] args) throws ParseException { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
     Date d = sdf.parse("2014-09-17T12:00:44.0000000Z"); 
     System.out.println(d); //output Wed Sep 17 12:00:44 IST 2014 
    } 
}