2013-10-16 16 views
13

Sto provando a creare un formato personalizzato per visualizzare il tempo trascorso.Formato personalizzato per intervallo di tempo relativo

Ora sto usando:

CharSequence relativeTimeSpan = DateUtils.getRelativeTimeSpanString(
    dateObject.getTime(), 
    System.currentTimeMillis(), 
    DateUtils.SECOND_IN_MILLIS, 
    flags); 

Questa operazione riporta il tempo relativo campate in questo modo:

  • 1 minuto fa
  • 36 minuti fa
  • 4 ore fa

...

Quello che sto cercando di fare è mostrare questo, come questo:

  • 1m
  • 36m
  • 4h

...

so DateUtils ha FORMAT_ABBREV_ALL, ma questo non abbrevia la stringa come voglio ...

Come posso creare qualcosa di personalizzato per questo?

risposta

8

ho fatto questo nel mio modulo di Twitter

public static String getTimeString(Date fromdate) { 

    long then; 
    then = fromdate.getTime(); 
    Date date = new Date(then); 

    StringBuffer dateStr = new StringBuffer(); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(date); 
    Calendar now = Calendar.getInstance(); 

    int days = daysBetween(calendar.getTime(), now.getTime()); 
    int minutes = hoursBetween(calendar.getTime(), now.getTime()); 
    int hours = minutes/60; 
    if (days == 0) { 

     int second = minuteBetween(calendar.getTime(), now.getTime()); 
     if (minutes > 60) { 

      if (hours >= 1 && hours <= 24) { 
       dateStr.append(hours).append("h"); 
      } 

     } else { 

      if (second <= 10) { 
       dateStr.append("Now"); 
      } else if (second > 10 && second <= 30) { 
       dateStr.append("few seconds ago"); 
      } else if (second > 30 && second <= 60) { 
       dateStr.append(second).append("s"); 
      } else if (second >= 60 && minutes <= 60) { 
       dateStr.append(minutes).append("m"); 
      } 
     } 
    } else 

    if (hours > 24 && days <= 7) { 
     dateStr.append(days).append("d"); 
    } else { 
     dateStr.append(twtimeformat.format(date)); 
    } 

    return dateStr.toString(); 
} 

public static int minuteBetween(Date d1, Date d2) { 
    return (int) ((d2.getTime() - d1.getTime())/DateUtils.SECOND_IN_MILLIS); 
} 

public static int hoursBetween(Date d1, Date d2) { 
    return (int) ((d2.getTime() - d1.getTime())/DateUtils.MINUTE_IN_MILLIS); 
} 

public static int daysBetween(Date d1, Date d2) { 
    return (int) ((d2.getTime() - d1.getTime())/DateUtils.DAY_IN_MILLIS); 
} 
+1

Grazie. Alla fine ho implementato qualcosa di simile a questo. Avrei preferito se ci fosse un metodo più semplice come quello della mia domanda, ma con qualche personalizzazione dietro. Ancora un'ottima risposta. Lo contrassegnerò come la soluzione. –

3

Creare Un metodo per differenza get data così

public static String getDateDifferenceForDisplay(Date inputdate) { 
    Calendar now = Calendar.getInstance(); 
    Calendar then = Calendar.getInstance(); 

    now.setTime(new Date()); 
    then.setTime(inputdate); 

    // Get the represented date in milliseconds 
    long nowMs = now.getTimeInMillis(); 
    long thenMs = then.getTimeInMillis(); 

    // Calculate difference in milliseconds 
    long diff = nowMs - thenMs; 

    // Calculate difference in seconds 
    long diffMinutes = diff/(60 * 1000); 
    long diffHours = diff/(60 * 60 * 1000); 
    long diffDays = diff/(24 * 60 * 60 * 1000); 

    if (diffMinutes < 60) { 
     return diffMinutes + " m"; 

    } else if (diffHours < 24) { 
     return diffHours + " h"; 

    } else if (diffDays < 7) { 
     return diffDays + " d"; 

    } else { 

     SimpleDateFormat todate = new SimpleDateFormat("MMM dd", 
       Locale.ENGLISH); 

     return todate.format(inputdate); 
    } 
} 

Poi si può chiamare in questo modo

String dateForDisplay = getDateDifferenceForDisplay(inputDate); 
1

Ci non è un metodo/utilità integrato per questo, ma è abbastanza semplice implementarne uno, usando 0 disponibilicostanti:

private static final String ABBR_YEAR = "y"; 
private static final String ABBR_WEEK = "w"; 
private static final String ABBR_DAY = "d"; 
private static final String ABBR_HOUR = "h"; 
private static final String ABBR_MINUTE = "m"; 

public static String getAbbreviatedTimeSpan(long timeMillis) { 
    long span = Math.max(System.currentTimeMillis() - timeMillis, 0); 
    if (span >= DateUtils.YEAR_IN_MILLIS) { 
     return (span/DateUtils.YEAR_IN_MILLIS) + ABBR_YEAR; 
    } 
    if (span >= DateUtils.WEEK_IN_MILLIS) { 
     return (span/DateUtils.WEEK_IN_MILLIS) + ABBR_WEEK; 
    } 
    if (span >= DateUtils.DAY_IN_MILLIS) { 
     return (span/DateUtils.DAY_IN_MILLIS) + ABBR_DAY; 
    } 
    if (span >= DateUtils.HOUR_IN_MILLIS) { 
     return (span/DateUtils.HOUR_IN_MILLIS) + ABBR_HOUR; 
    } 
    return (span/DateUtils.MINUTE_IN_MILLIS) + ABBR_MINUTE; 
} 
+0

questo va bene, tranne per il suo giorno avanti! . Qualche idea per quale motivo? – Tina

Problemi correlati