2011-12-22 13 views
6

jestem coraz ParseException na poniższym kodziejava.text.ParseException: Unparseable date: yyyy-MM-dd HH: mm: ss.SSSSSS

String dateStr = "2011-12-22 10:56:24.389362"; 
    String formatStr = "yyyy-MM-dd HH:mm:ss.SSSSSS"; 
    Date testDate = null; 
    SimpleDateFormat sdf= new SimpleDateFormat(formatStr); 
    sdf.setLenient(false); 
    testDate = sdf.parse(dateStr); 

    System.out.println("CHECK DATE " + sdf.format(testDate)); 

Exception in thread "main" java.text.ParseException: Unparseable date: "2011-12-22 10:56:24.389362" at java.text.DateFormat.parse(DateFormat.java:337)

Gdybym wykomentuj linię sdf.setLenient(false), wtedy widzę różnicę czasu w ouput CHECK DATE 2011-12-22 11:02:53.000362

Co robię źle?

Odpowiedz

7

"S" oznacza milisekundę. Istnieje 1000 (0 do 999) milisekund na sekundę. 389362 jest większy niż 999. Dodatkowe 389000 milisekund jest konwertowane na 389 sekund lub 6 minut 29 sekund i dodawane do czasu.

+0

Jaki powinien być wzór, aby umożliwić 389362? – Praneeth

+0

Milisekundy to najkrótszy dozwolony czas. Musisz zmienić dane wejściowe, aby w przykładzie wyświetlały się tylko trzy cyfry dziesiętne "389", a format kończy się na ".SSS" –

+0

Dzięki. Albo muszę zmienić moje dane wejściowe na trzy cyfry dziesiętne, albo muszę napisać mój własny parser, który pozwala na mikrosekundy według @GrailsGuy – Praneeth

3

Wprowadzona przez użytkownika wartość milisekund jest niepoprawna. Powinno być: -

String dateStr = "2011-12-22 10:56:24.389";

też nie potrzebują dodatkowej liczby „S” S w strukturze. Poniższa powinno wystarczyć:

String formatStr = "yyyy-MM-dd HH:mm:ss.S";

To jest wyraźnie wymienione w java docs na typ prezentacji Number:

Ilość: Do formatowania, liczba liter wzór jest minimalna liczba cyfr , a krótsze liczby są wyzerowane do tej wartości. Do parsowania, liczba liter wzorców jest ignorowana, chyba że jest potrzebna do rozdzielenia dwóch sąsiednich pól.

Działa, gdy ustawisz łagodność, aby była prawdziwa (lub skomentował linię, która domyślnie jest prawdą), ponieważ pytasz, czy analizator składni nie jest ściśle związany z analizą składni. Od java docs na setLenient(): -

Określ, czy parsowanie daty/czasu ma być łagodne. W przypadku łagodnego analizowania parser może użyć heurystyki do interpretacji danych wejściowych , które nie są dokładnie dopasowane do formatu tego obiektu. Przy ścisłym analizowaniu wejścia muszą być zgodne z formatem tego obiektu.

4

Specyfikator formatu S odnosi się do milisekund. Gdy zezwalasz na łagodne analizowanie, ostatnia część jest interpretowana jako 389362 milisekund. Kiedy jest to dodane do tej pory, ostatnie 3 cyfry (właściwie wartość% 1000) stają się rzeczywistymi milisekundami, a kończysz z datą około 389 sekund (~ 6 1/2 minuty) później niż się spodziewasz . (Przy ścisłym analizowaniu parser wie, że 389362 milisekund nie ma sensu, więc powoduje błąd.)

Najprostszym sposobem, jeśli możesz zagwarantować, że data będzie zawsze wyglądać tak, będzie ostatnie 3 cyfry wyłączone. (W ten sposób około połowa czasu da ci datę, która jest wyłączona o milisekundę, ale to jest lepsze niż pisanie parsera dat ...)

2

S ma być używany tylko do milliseconds. Jeśli potrzebujesz mikrosekund, będziesz musiał napisać własny parser.

0

Zastosowanie toISOString('HH:mm:ss.S') uzyskać milisekund (3 cyfry), a następnie pełna, jak trzeba z 0.

Na przykład:

new Date().toISOString('HH:mm:ss.S') 

zwraca "2012-02-10T12: 16: 39.124Z"

Powiązane problemy