2016-07-13 7 views
4

Ich habe den folgenden Code, um eine Server zurückgegebene Datumszeichenfolge in eine seit Zeichenfolge zu konvertieren.Android: How to Build seit Datum von Server-Datum

/** 
* Change date format to "since" string 
* */ 
public static String timeSince(String dateString) { 
    Date date = stringToDate(dateString); 
    String result = (DateUtils.getRelativeTimeSpanString(date.getTime())).toString(); 
    return result; 
} 
/** 
* Function to convert server date string to Date 
* */ 
public static Date stringToDate(String s){ 
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
    try { 
     return df.parse(s); 
    } catch(ParseException e){ 
     e.printStackTrace(); 
    } 
    return null; 
} 

Aber als Beispiel, wenn ich rufe Timesince ("2016-07-04T07: 21: 39.575Z") I "4, Juli 2016" erhalten als Ergebnis, 3 statt so etwas wie“ vor Tagen "oder eine andere Zeit im Vergleich zu jetzt Zeit. Irgendeine Idee warum? Thx ...

+0

Was passiert, wenn Sie SimpleDateFormat ("yyyy-MM-dd") verwenden? –

+0

Sind Sie sicher, dass dies der Code ist, der aufgerufen wird? –

+0

@MohammadRezaKhatami Das Gleiche passiert – DrMad

Antwort

1

OK. Es stellt sich heraus, dass DateUtils.getRelativeTimeSpanString (date.getTime()) gibt eine RELATIV Dauer (zB „gestern“ oder „30 Minuten vor“) AUSSER wenn die Dauer größer als eine Woche ist, in welchem ​​Fall es liefert eine ABSOLUTE (siehe den Code) Datum ...

Nichts in der Dokumentation sagt so ... Aber das ist eine Tatsache. Ein weiterer Nachteil der meisten Android-Lösungen ist, dass die Nachrichten nicht lokalisiert sind ("vor 3 Minuten" funktioniert weder in Französisch noch in Spanisch noch in irgendeiner anderen Sprache). Also werde ich wahrscheinlich dafür eine eigene Bibliothek schreiben.

Endergebnis ist, dass, wenn Sie Englisch verwenden und das Datum als ein absolutes Datum anzeigen möchten, wenn es vor mehr als einer Woche ist, der obige Code funktioniert.

-1

Versuchen Sie folgendes:

Date now = new Date(); 
String str = DateUtils.getRelativeDateTimeString(

    this, // Suppose you are in an activity or other Context subclass 

    now.getTime(), // The time to display 

    DateTimeUtils.MINUTE_IN_MILLIS, // The resolution. This will display only 
             // minutes (no "3 seconds ago") 


    DateTimeUtils.WEEK_IN_MILLIS, // The maximum resolution at which the time will switch 
         // to default date instead of spans. This will not 
         // display "3 weeks ago" but a full date instead 

     0); // Eventual flags 

Andere Werte für MINUTE_IN_MILLIS und YEAR_IN_MILLIS umfassen:

  • SECOND_IN_MILLIS
  • MINUTE_IN_MILLIS
  • HOUR_IN_MILLIS
  • DAY_IN_MILLIS
  • WEEK_IN_MILLIS
  • YEAR_IN_MILLIS

All benutzerdefinierte Wert in Millisekunden

DateUtils.getRelativeTimeSpanString(yourContext, theEventInMillis, 
            DateUtils.MINUTE_IN_MILLIS, 
            DateUtils.FORMAT_NO_NOON); 

Dies wird theEventInMillis relatives Format, was auch immer das aktuelle Uhrzeit des Systems ist. Es werden Änderungen in Minuten angezeigt (vor 0 Minuten, vor 2 Minuten, vor 3 Stunden, vor 1 Tag, usw.), bis der Unterschied eine Woche erreicht, dann wird nur das gesamte Datum gepostet.

Ich hoffe, das hilft Ihnen.

+0

why -1? Das ist ein Weg und ein einfaches Beispiel für getRelativeDateTimeString –

+0

Ich weiß nicht, wer downvoted, aber das beantwortet meine Frage nicht, die ist "Warum funktioniert mein Code nicht?" – DrMad

+0

Dies ist ein Standardbeispiel Sie können es verwenden, um eine Lösung zu bekommen, es scheint, dass Ihr Code debuggen muss, also sollten Sie meine Antwort testen und Ihren Weg ändern. –