2010-10-27 13 views
30

Nie mogłem nigdzie tego znaleźć. Pobieram niektóre JSON z interfejsu API, który zwraca standardowe daty JSON. Można zobaczyć format uruchamiając ten kod w konsoli javascript:Data JSON do daty Java?

> new Date().toJSON(); 
"2010-10-27T11:58:22.973Z" 

Właściwie API pracuję z nie wraca części milisekundy, a czasami zwraca czasową zamiast Z, więc terminy mogą wyglądać któregokolwiek z nich:

  • 2010-10-27T11:58:22Z
  • 2010-10-27T11:58:22+03:00

Parsowanie tego rodzaju dat jest nieco kłopotliwe. Czy istnieje sposób na przeanalizowanie tego rodzaju dat, używając org.json?

Moje obecne rozwiązanie jest:

public static Date parseDateTime(String dateString) { 
    if (dateString == null) return null; 
    DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ"); 
    if (dateString.contains("T")) dateString = dateString.replace('T', ' '); 
    if (dateString.contains("Z")) dateString = dateString.replace("Z", "+0000"); 
    else 
     dateString = dateString.substring(0, dateString.lastIndexOf(':')) + dateString.substring(dateString.lastIndexOf(':')+1); 
    try { 
     return fmt.parse(dateString); 
    } 
    catch (ParseException e) { 
     Log.e(Const.TAG, "Could not parse datetime: " + dateString); 
     return null; 
    } 
} 

Fuj!

+0

W komentarzu poniżej wspomniałeś, że wdrażasz na Androida. Czy wypróbowałeś 'ZZZZZ' Androida' SimpleDateFormat'? –

Odpowiedz

17

Tym formatem DateTime jest w rzeczywistości ISO 8601 DateTime. JSON nie określa żadnego konkretnego formatu dla dat/czasów. Jeśli trochę Google, znajdziesz wiele implementacji do parsowania go w Javie.

Here's one

Jeśli jesteś otwarty do korzystania z czegoś innego niż Java wbudowanego w data/czas zajęć/Kalendarz, Chciałbym również zasugerować Joda Time. Oferują (między innymi) ISODateTimeFormat do parsowania tego rodzaju ciągów.

+0

+1 dla zalecenia czasu Jody –

+0

Hmm, interesujące. Ich rozwiązanie jest bardzo podobne do mojego :). To dziwne, że Java nie ma tego wbudowanego, jeśli jest to standard. – Felix

+0

Jeśli chodzi o czas Joda, mój projekt jest na Androida i chcę używać jak najmniejszej ilości zewnętrznych bibliotek. Dzięki za podpowiedź. – Felix

6

Jeśli potrzebujesz obsługi więcej niż jednego formatu, będziesz musiał dopasować wzór do swoich danych wejściowych i odpowiednio je przeanalizować.

final DateFormat fmt; 
if (dateString.endsWith("Z")) { 
    fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
} else { 
    fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
} 

Przypuszczam, że masz do czynienia z błędem w API używasz który cytowany datę Z czasowej wzór gdzieś ...

+0

Dozwolone jest literalne Z - jest to inny sposób na wyrażenie '+00: 00', tj. Czas UTC. To skrót od "zulu": "... również potocznie zwany" czasem zulu ", szczególnie w Stanach Zjednoczonych wojskowych ..." ([Wikipedia] (http://en.wikipedia.org/wiki/ Coordinated_Universal_Time)) –

13

Zauważ, że wzór formatu SimpleDateFormat Z jest dla RFC 822 strefa czasowa i wzorzec X odnoszą się do ISO 8601 (ten standard obsługuje jednoliterowe nazwy stref czasowych, takie jak Z dla Zulu).

Tak więc new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX") tworzy format, który może analizować zarówno "2013-03-11T01:38:18.309Z" i "2013-03-11T01:38:18.309+0000" i da taki sam wynik.

Niestety, o ile mogę powiedzieć, nie można uzyskać tego formatu, aby wygenerować wersję Z dla Zulu, co jest denerwujące.

Rzeczywiście mam więcej problemów ze stroną JavaScript, aby poradzić sobie z obydwoma formatami.