2012-06-14 13 views
13

Przechowuję wiadomości z chmury amazońskiej i zamawiam je według ich znacznika czasu na posortowanej mapie.Java Data do milliseconds

ja parsowania znacznika czasu z obłoku z następującego kodu:

Date timestamp = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'Z'", Locale.ENGLISH).parse(time); 

a następnie I 'm przechowywanie w nich mapy posortowanej z kluczem jest data. Problem polega na tym, że data sprowadza się tylko do precyzji sekund. Mogę mieć kilka wiadomości wysłanych w ciągu 1 sekundy, więc muszę je zamówić z precyzją milisekundy. Czy istnieje struktura danych, która na to pozwala?

+3

Pokaż nam wartość 'time'. – adarshr

+1

Twój format mówi "SSS", więc millis musi tam być –

+0

Jeśli 'czas' zawiera strefę czasową UTC (' Z'), użyj 'rrrr-MM-dd'T'hh: mm: ss.SSSZ' zamiast' rrrr-MM -dd'T'hh: mm: ss.SSS'Z''. 'Z' będzie * chwytać *' Z' oraz np. '+ 0100' –

Odpowiedz

20

Tak długo, jak źródło ma wyższą rozdzielczość niż 1 sekunda. Wygląda na to ze wzoru, ale nie pokazałeś nam żadnego przykładowego przykładu.

Date to tylko opakowanie wokół long milisekund od 1970-01-01. Więc już to masz. Date.getTime() zwróci to z dokładnością do milisekund.

Dlaczego uważasz, że Date ma tylko jedną sekundę precyzji? Date.compareTo(Date anotherDate) porównuje na poziomie milisekundy. Tak więc Twoja SortedMap powinna działać poprawnie, chyba że robisz coś dziwnego.

+0

Myślałem, że to nie było w stanie, ponieważ nie byłem w stanie uzyskać milisekund lub je ustawić. Ale masz rację. Dziękuję za to. Błąd wynikał z faktu, że pochłaniałem wiadomości w tempie, w jakim przybywali. Oznaczało to, że czas nie był właściwie wykorzystywany. Naprawiono go, czekając 350 milisekund, a następnie pobierając z kolejki. –

1

Nie jestem pewien, czy to zrobiłeś, ale możesz stworzyć własny komparator i użyć go.

Na marginesie, w zależności od konfiguracji aplikacji, możesz być ostrożny przy korzystaniu z SimpleDateFormat, ale są pewne problemy.