Пользовательский формат для относительного периода времени
Я пытаюсь создать пользовательский формат для отображения прошедшего времени.
Теперь я использую:
CharSequence relativeTimeSpan = DateUtils.getRelativeTimeSpanString(
dateObject.getTime(),
System.currentTimeMillis(),
DateUtils.SECOND_IN_MILLIS,
flags);
Возвращает относительные временные интервалы следующим образом:
- 1 минута назад
- 36 минут назад
- 4 часа назад
...
То, что я пытаюсь сделать, это показать это, например:
...
Я знаю, что DateUtils имеет флаг FORMAT_ABBREV_ALL, но это не сокращает строку, как я хочу...
Как я могу создать что-то обычное для этого?
Ответы
Ответ 1
Я сделал это в своем модуле 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);
}
Ответ 2
Создайте один метод для получения разницы даты, подобный этому
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);
}
}
Тогда вы можете называть это следующим образом
String dateForDisplay = getDateDifferenceForDisplay(inputDate);
Ответ 3
Для этого нет встроенного метода/утилиты, но довольно просто реализовать его, используя доступные константы DateUtils
:
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;
}