Отобразить относительную дату в пользовательском формате в Android

Я хочу перевести дату в удобочитаемый формат. Я использую DateUtils. getRelativeDateTimeString, но это не соответствует критериям. Вывод, который я получаю, выглядит примерно так: 1 час 15 минут. назад и т. д.

Я хочу знать, возможно ли изменить формат на:

3 м вместо 3 мин. назад,

1 час вместо 1 часа. 15 мин. назад и т. д.

используя DateUtils или есть другой способ сделать это?

Чтобы быть более точным, я ищу Android-эквивалент этого углового фильтра, где вы можете легко изменить формат относительной даты (например: {{minutes}} minutes ago в {{minutes}}m,

Чтобы прояснить ситуацию, я не ищу способ форматирования даты, но перевожу дату в удобочитаемый для человека формат, такой как "сегодня", "1 час", "38 минут" (аналогично относительным датам в Facebook).

4 ответа

Решение

После некоторых исследований я обнаружил некоторые библиотеки, такие как Time4A, Joda-Time, PrettyTime, Android-Ago.

Однако я решил не использовать библиотеку и переопределить ее текстовые ресурсы, а создать метод и сохранить текст в strings.xml для возможной будущей локализации.

    private static final int SECOND_MILLIS = 1000;
    private static final int MINUTE_MILLIS = 60 * SECOND_MILLIS;
    private static final int HOUR_MILLIS = 60 * MINUTE_MILLIS;
    private static final int DAY_MILLIS = 24 * HOUR_MILLIS;
    private static final int WEEK_MILLIS = 7 * DAY_MILLIS;

    public static String getTimeAgo(Date date, Context context) {
        Date now = Calendar.getInstance().getTime();
        final long diff = now.getTime() - date.getTime();

        if (diff < SECOND_MILLIS) {
            return context.getString(R.string.just_now);
        } else if (diff < MINUTE_MILLIS) {
            return diff / SECOND_MILLIS + context.getString(R.string.seconds_ago);
        } else if (diff < 2 * MINUTE_MILLIS) {
            return context.getString(R.string.a_minute_ago);
        } else if (diff < 59 * MINUTE_MILLIS) {
            return diff / MINUTE_MILLIS + context.getString(R.string.minutes_ago);
        } else if (diff < 90 * MINUTE_MILLIS) {
            return context.getString(R.string.an_hour_ago);
        } else if (diff < 24 * HOUR_MILLIS) {
            return diff / HOUR_MILLIS + context.getString(R.string.hours_ago);
        } else if (diff < 48 * HOUR_MILLIS) {
            return context.getString(R.string.yesterday);
        } else if (diff < 6 * DAY_MILLIS) {
            return diff / DAY_MILLIS + context.getString(R.string.days_ago);
        } else if (diff < 11 * DAY_MILLIS) {
            return context.getString(R.string.a_week_ago);
        } else {
            return diff / WEEK_MILLIS + context.getString(R.string.weeks_ago);
        }
    }

Используйте встроенную служебную библиотеку DateUtils, которая была включена в уровень API 3.

 CharSequence getRelativeDateTimeString (Context c, 
             long time, 
             long minResolution, 
             long transitionResolution, 
             int flags) Return string describing the elapsed time since startTime formatted like "[relative time/date], [time]".

Пример выходных строк для формата даты в США:

3 мин назад, 10:15 вчера, 12:20 12 декабря, 4:12 14.11.2007, 8:20

Почему бы вам не проанализировать дату в формате, который вы хотите?

С помощью string.replace() вы можете сделать это в одной строке кода.

Редактировать 1: Я обычно использую SimpleDateForma таким образом, надеюсь, это поможет:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String currentDateandTime = sdf.format(new Date());

Вам понадобится этот импорт (я думаю, что Android автоматически импортирует):

import java.text.SimpleDateFormat;
import java.util.Date;

Изменить 2: В вашем примере, что вы должны сделать, это:

SimpleDateFormat sdf = new SimpleDateFormat("HH'h' mm'm'"); String currentDateandTime = sdf.format(new Date()); System.out.println("Today in dd-MM-yy:HH:mm:SS : " + date);

Вы должны использовать SimpleDateFormat и указать желаемый шаблон. Что в вашем случае будет примерно таким:

String template = "H'h', m'm'";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(template, Locale.getDefault());
String formatted = simpleDateFormat.format(new Date());
Другие вопросы по тегам