Renderizar datas de hangouts / bate-papo no Facebook (exemplo Java GWT)

Função simples para converter datas em algo mais facilmente legível por humanos.

Irá mostrar coisas como:

  • Agora (se menos de um minuto)
  • 12 minutos atrás (se menos de uma hora)
  • 15:47 (se mais de uma hora no mesmo dia)
  • 12 de junho, 15:47 (se for um dia antes de hoje)

Código:

public static String getReadableTimeSince(Date input)
{
Date now = new Date();

if(now.before(input))
{
Log.error("Date cannot be in the future:" + input);
return "";
}

if(CalendarUtil.isSameDate(input, now))
{
Long diff = now.getTime() - input.getTime();

if(TimeUnit.MILLISECONDS.toSeconds(diff) < 60)
{
return "Now";
}
else if(TimeUnit.MILLISECONDS.toMinutes(diff) < 60)
{
long mins = TimeUnit.MILLISECONDS.toMinutes(diff);

return mins == 1 ? mins + " min" : mins + " mins";
}
else if(TimeUnit.MILLISECONDS.toHours(diff) < 24)
{
return DateTimeFormat.getFormat("kk:mm").format(input);
}

}
else if(CalendarUtil.getDaysBetween(input, now) > 0)
{
// message was before today
return DateTimeFormat.getFormat("dd MMM, kk:mm").format(input);
}

return "";
}