2011-01-24 12 views
5

mam pobierania datetime z DB SQLite, które wychodzi w formacie ...Format ciąg datetime do czasu tylko

2011-01-24 02:45:00 

W języku C# można po prostu użyć DateTime.Parse("2011-01-24 02:45:00").ToString("HH:mm") aby uzyskać ciąg 02:45

Czy mogę to zrobić w Android/Java? Mój kod w moim Android app wygląda następująco ...

// dateStr below is logging as correctly being yyyy-MM-dd HH:mm:ss format 
String dateStr = cursor.getString(cursor.getColumnIndex("start_time")); 
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 
String shortTimeStr = sdf.format(dateStr); // <-- throws IllegalArgumentException 

EDIT: Dzięki obu doc_180 i Konstantin Burov - przykładów podanych pomogły mi rozwiązać ten problem. Częścią problemu było to, że importowałem java.sql.Date zamiast java.util.Date. Zmieniłem sprawy i teraz to działa doskonale.

+0

SimpleDateFormat potrzebuje argumentu daty, a nie łańcucha. Powinieneś zapisać swoją datę jako milisekundy i utworzyć obiekt daty z tego. Data d = nowa Data (dateAsMillisec), a następnie przekaż ją do prostego formatu. –

+0

@ doc_180: OK, przepraszam, masz rację - prawdopodobnie musisz przemyśleć moje pytanie. Moim problemem jest to, że mój DB na stronie Android jest "lustrem" SQLite DB aplikacji opartej na komputerze PC, który używa tego długiego/wstecznego formatu datetime i chciałbym zachować te same formaty. Próbowałem przy użyciu Date.parse (String), a następnie sdf.format (...), ale również rzucił wyjątek. – Squonk

+0

Czy wypróbowałeś mój kod. Działa i sprawdziłem. –

Odpowiedz

11

trzeba wykonać następujące czynności.

try { 
    Date date = null; 
    date = df.parse("2011-01-24 02:45:00"); 
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 
    String shortTimeStr = sdf.format(date); 
    System.out.println(shortTimeStr); 
} catch (ParseException e) { 
    // To change body of catch statement use File | Settings | File Templates. 
    e.printStackTrace(); 
} 

Jak wspomniałem w komentarzu, należy przechowywać czas jako milisekundy zamiast ciągu. W przeciwnym razie nie widzę innego sposobu niż utworzenie obiektu pośredniego Date.

+0

Dziękuję, zobacz moje EDYCJA na końcu mojego pytania. Myślę, że przechowywanie daty tak długiej (milisekundy) może być sposobem na odejście w przyszłości, ale w tej chwili jestem odbiciem DB SQL na PC stworzonym przez kogoś innego, więc trzymam się tych samych formatów między PC/Androidem. – Squonk

+3

co to jest df? – Androiduser

+0

Co to jest skrót df? – Rick

2

SimpleDateFormat.format oczekuje daty lub kalendarza jako argumentu podczas przekazywania ciągu znaków. Najpierw konwertuj ciąg znaków na datę.

String dateStr = cursor.getString(cursor.getColumnIndex("start_time")); 
SimpleDateFormat toFullDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date fullDate = toFullDate.parse(dateStr); 
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 
String shortTimeStr = sdf.format(fullDate); 

i data tak, wolałbym tak długo przechowywane w bazie danych, więc coraz obiekt Date wtedy byłoby bardziej trywialny:

Long dateMilliseconds = cursor.getLong(cursor.getColumnIndex("start_time")); 
Date fullDate = new Date(dateMilliseconds); 
+0

Dziękuję, zobacz moje EDYCJA na końcu mojego pytania. Myślę, że przechowywanie daty tak długiej (milisekundy) może być sposobem na odejście w przyszłości, ale w tej chwili jestem odbiciem DB SQL na PC stworzonym przez kogoś innego, więc trzymam się tych samych formatów między PC/Androidem. – Squonk