Как рассчитать прошедшее время с помощью Joda-Time?

Мне нужно рассчитать время, прошедшее с одной конкретной даты до настоящего времени, и отобразить его в том же формате, что и вопросы Stackru, а именно:

15s ago
2min ago
2hours ago
2days ago
25th Dec 08

Знаете ли вы, как добиться этого с помощью библиотеки Java Joda-Time? Есть ли вспомогательный метод, который уже реализует его, или я должен сам написать алгоритм?

6 ответов

Решение

Чтобы рассчитать прошедшее время с JodaTime, используйте Period, Чтобы отформатировать прошедшее время в желаемом человеческом представлении, используйте PeriodFormatter который вы можете построить PeriodFormatterBuilder,

Вот начальный пример:

DateTime myBirthDate = new DateTime(1978, 3, 26, 12, 35, 0, 0);
DateTime now = new DateTime();
Period period = new Period(myBirthDate, now);

PeriodFormatter formatter = new PeriodFormatterBuilder()
    .appendSeconds().appendSuffix(" seconds ago\n")
    .appendMinutes().appendSuffix(" minutes ago\n")
    .appendHours().appendSuffix(" hours ago\n")
    .appendDays().appendSuffix(" days ago\n")
    .appendWeeks().appendSuffix(" weeks ago\n")
    .appendMonths().appendSuffix(" months ago\n")
    .appendYears().appendSuffix(" years ago\n")
    .printZeroNever()
    .toFormatter();

String elapsed = formatter.print(period);
System.out.println(elapsed);

Это печатает сейчас

3 секунды назад
51 минут назад
7 часов назад
6 дней назад
10 месяцев назад
31 лет назад

(Кашель, старик, кашель) Вы видите, что я также учел месяцы и годы и настроил его, чтобы пропустить значения, когда они равны нулю.

Используйте PrettyTime для простого прошедшего времени.

Я попробовал HumanTime, когда @sfussenegger ответил и использовал JodaTime's. Period но самым простым и чистым методом для удобочитаемого человеком времени, которое я нашел, была библиотека PrettyTime.

Вот пара простых примеров с вводом и выводом:

Пять минут назад

DateTime fiveMinutesAgo = DateTime.now().minusMinutes( 5 );

new PrettyTime().format( fiveMinutesAgo.toDate() );

// Outputs: "5 minutes ago"

Аго назад

DateTime birthday = new DateTime(1978, 3, 26, 12, 35, 0, 0);

new PrettyTime().format( birthday.toDate() );

// Outputs: "4 decades ago"

ВНИМАНИЕ: Я попытался поиграть с более точной функциональностью библиотеки, но она дает странные результаты, поэтому используйте ее с осторожностью.

JP

Вы можете сделать это с помощью PeriodFormatter, но вам не нужно прилагать усилия для создания собственного PeriodFormatBuilder, как в других ответах. Если это подходит для вашего случая, вы можете просто использовать форматтер по умолчанию:

Period period = new Period(startDate, endDate);
System.out.println(PeriodFormat.getDefault().print(period))

(Шляпа к этому ответу на похожий вопрос, я кросс-публикация для обнаружения)

Есть небольшой вспомогательный класс HumanTime, которым я очень доволен.

Это использует метку времени mysql, чтобы получить истекшее время до настоящего момента. Управление единичным и множественным числом. Отображать только максимальное время.

ПРИМЕЧАНИЕ: установите свой часовой пояс.

      String getElapsedTime(String strMysqlTimestamp) {
    
    DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.S");
    DateTime mysqlDate = formatter.parseDateTime(strMysqlTimestamp).
                         withZone(DateTimeZone.forID("Asia/Kuala_Lumpur"));
    
    DateTime now = new DateTime();
    Period period = new Period(mysqlDate, now);
    
    int seconds = period.getSeconds();
    int minutes = period.getMinutes();
    int hours = period.getHours();
    int days = period.getDays();
    int weeks = period.getWeeks();
    int months = period.getMonths();
    int years = period.getYears();
    
    String elapsedTime = "";
    if (years != 0)
        if (years == 1)
            elapsedTime = years + " year ago";
        else
            elapsedTime = years + " years ago";
    else if (months != 0)
        if (months == 1)
            elapsedTime = months + " month ago";
        else
            elapsedTime = months + " months ago";
    else if (weeks != 0)
        if (weeks == 1)
            elapsedTime = weeks + " week ago";
        else
            elapsedTime = weeks + " weeks ago";
    else if (days != 0)
        if (days == 1)
            elapsedTime = days + " day ago";
        else
            elapsedTime = days + " days ago";
    else if (hours != 0)
        if (hours == 1)
            elapsedTime = hours + " hour ago";
        else
            elapsedTime = hours + " hours ago";
    else if (minutes != 0)
        if (minutes == 1)
            elapsedTime = minutes + " minute ago";
        else
            elapsedTime = minutes + " minutes ago";
    else if (seconds != 0)
        if (seconds == 1)
            elapsedTime = seconds + " second ago";
        else
            elapsedTime = seconds + " seconds ago";   
    
    return elapsedTime;
} 

Вот мое решение , используя joda time.

      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;

public static String getTimeAgo(long time)
{
    if(time < 1000000000000L)
    {
        time *= 1000;
    }

    long now = System.currentTimeMillis();

    if(time > now || time <= 0)
    {
        return null;
    }

    final long diff = now - time;

    if(diff < MINUTE_MILLIS)
    {
        return "just now";
    }
    else if(diff < 2 * MINUTE_MILLIS)
    {
        return "a minute ago";
    }
    else if(diff < 50 * MINUTE_MILLIS)
    {
        return diff / MINUTE_MILLIS + " minutes ago";
    }
    else if(diff < 90 * MINUTE_MILLIS)
    {
        return "an hour ago";
    }
    else if(diff < 24 * HOUR_MILLIS)
    {
        return diff / HOUR_MILLIS + " hours ago";
    }
    else if(diff < 48 * HOUR_MILLIS)
    {
        return "yesterday";
    }
    else
    {
        return diff / DAY_MILLIS + " days ago";
    }
}

Как пользоваться методом:

Просто вызовите метод и пройдите вовремя в milliseconds.

Например :

      long now = System.currentTimeMillis();
getTimeAgo(now);
Другие вопросы по тегам