2014-09-12 11 views
19

Mam pole daty (lastUpdated). Chcę przetłumaczyć tę datę na format czytelny dla człowieka, taki jak "dzisiaj", "1 dzień temu", "2 dni temu", ...Formatować datę względną do formatu czytelnego dla człowieka w systemie Android przy użyciu Androida DateUtils API

Używam interfejsu API android.text.format.DateUtils dołączonego do biblioteki Androida.

Oto moja próba:

DateUtils.getRelativeDateTimeString(context, 
        lastUpdated.getTime(), 
        DateUtils.DAY_IN_MILLIS, 
        DateUtils.WEEK_IN_MILLIS, 
        DateUtils.FORMAT_SHOW_YEAR); 

Oto wynik:

0 day ago, 12:00am 
yesterday, 9:30am 
2 days ago, 1:30pm 
Sep 4, 12:30pm 

Wynik Spodziewałem: (Brak informacji o czasie)

0 day ago --------- This should be 'today' 
yesterday 
2 days ago 
Sep 4 

UWAGA: jeśli wyczyści się czas od ostatniej Aktualizacji. Pokaże "12: 00am" dla informacji o czasie.

Ktoś ma jakieś pomysły? Czy istnieje sposób na usunięcie czasu z danych wyjściowych?

Dziękujemy!

Odpowiedz

49

Można użyć do tego DateUtils.getRelativeTimeSpanString:

long now = System.currentTimeMillis(); 
DateUtils.getRelativeTimeSpanString(lastUpdated.getTime(), now, DateUtils.DAY_IN_MILLIS); 
+2

Używam tego i działa dobrze dla API 18+, ale API 16 i 17 to pokazuje "w 0 dni" i "jutro" (małe litery) zamiast "Dzisiaj" i "Jutro" na emulatorze Androida. Ktoś ma pojęcie, dlaczego tak jest? – levavare

+0

Świetne ............ –

1

Wygląda na to, że chcesz mieć niestandardową obsługę ostatnich czasów i coś więcej w przypadku dat, które są dalej. coś jak to będzie działać:

public String getTimeDiff(long secondsTimeDiff) 
{  
    long secondsInOneDay = 84600; 
    int maxDaysAgo = 10; 

    if (secondsTimeDiff < secondsInOneDay) 
    { 
     return "today"; 
    } 
    else if (secondsTimeDiff < 2*secondsInOneDay) 
    { 
     return "yesterday"; 
    } 
    else if (secondsTimeDiff < maxDaysAgo*secondsInOneDay) 
    { 
     int days = (int) (secondsTimeDiff/secondsInOneDay); 
     return days + " days ago"; 
    } 
    else 
    { 
     //use normal DateUtils logic here... 
     return "...."; 
    } 
} 
+3

To rozwiązanie jest mega podatne na błędy i nie obsługuje i18n. Gorąco polecam używanie klasy DateUtils. – JakeWilson801

Powiązane problemy