Java – Shows before time like Twitter

Shows before time like Twitter… here is a solution to the problem.

Shows before time like Twitter

I’m using DateUtils.getRelativeTimeSpanString() to display the posting time.

The string it returns is something like this: 1 minute ago, but I guess 1 m or 1 h and so on (shortened and not before).

I can replace “hours” with “h” or “minutes” with “m”, but it doesn’t work if the language is different from English. Twitter is using it now. English/Cyrillic How Twitter is displayed.

enter image description here

enter image description here

Update: I’ll accept @Bradley Wilson’s answer, although I’ll add a cleaner solution here (with the JodaTime package again). In addition, the rest of the answers can also be modified to the same result, so they are worth voting. Thank you all :

    DateTime postMaded = new DateTime(your previous date);
    DateTime nowUpdate = new DateTime();

Period period = new Period(postMaded, nowUpdate);

PeriodFormatter formatter;

Locale current = ConverterMethods.getCurrentLocale();

if (current.getLanguage().contentEquals(any Cyrillic language )) {

if (period.getYears() != 0) {
            formatter = new PeriodFormatterBuilder().appendYears().appendSuffix(" г."). printZeroNever().toFormatter();
        } else if (period.getMonths() != 0) {
            formatter = new PeriodFormatterBuilder().appendMonths().appendSuffix(" м").printZeroNever().toFormatter();
        } else if (period.getWeeks() != 0) {
            formatter = new PeriodFormatterBuilder().appendWeeks().appendSuffix(" седм."). printZeroNever().toFormatter();
        } else if (period.getDays() != 0) {
            formatter = new PeriodFormatterBuilder().appendDays().appendSuffix(" д").printZeroNever().toFormatter();
        } else if (period.getHours() != 0) {
            formatter = new PeriodFormatterBuilder().appendHours().appendSuffix(" ч").printZeroNever().toFormatter();
        } else if (period.getMinutes() != 0) {
            formatter = new PeriodFormatterBuilder().appendMinutes().appendSuffix(" мин").printZeroNever().toFormatter();
        } else {
            formatter = new PeriodFormatterBuilder().appendSeconds().appendSuffix(" с").printZeroNever().toFormatter();
        }

} else {

if (period.getYears() != 0) {
            formatter = new PeriodFormatterBuilder().appendYears().appendSuffix(" y").printZeroNever().toFormatter();
        } else if (period.getMonths() != 0) {
            formatter = new PeriodFormatterBuilder().appendMonths().appendSuffix(" mon").printZeroNever().toFormatter();
        } else if (period.getWeeks() != 0) {
            formatter = new PeriodFormatterBuilder().appendWeeks().appendSuffix(" w").printZeroNever().toFormatter();
        } else if (period.getDays() != 0) {
            formatter = new PeriodFormatterBuilder().appendDays().appendSuffix(" d").printZeroNever().toFormatter();
        } else if (period.getHours() != 0) {
            formatter = new PeriodFormatterBuilder().appendHours().appendSuffix(" h").printZeroNever().toFormatter();
        } else if (period.getMinutes() != 0) {
            formatter = new PeriodFormatterBuilder().appendMinutes().appendSuffix(" m").printZeroNever().toFormatter();
        } else {
            formatter = new PeriodFormatterBuilder().appendSeconds().appendSuffix(" s").printZeroNever().toFormatter();
        }
    }

Solution

Check out PrettyTime library.

It’s very simple to use :

Import org.ocpsoft.prettytime.prettyTime

PrettyTime p = new PrettyTime();
System.out.println(p.format(new Date()));
 prints "moments ago"

You can also pass in locales: for internationalized messages

PrettyTime p = new PrettyTime(new Locale("fr"));
System.out.println(p.format(new Date()));
 prints "à l'instant"

As mentioned in the review, Android has built this feature into android.text.format.DateUtils Medium class.

Related Problems and Solutions