import java.time.Instant;
import java.time.temporal.ChronoUnit;
public class RelativeTime {
public static String toRelativePastTime(Instant dateTime) {
Instant now = Instant.now();
long seconds = Math.abs(ChronoUnit.SECONDS.between(now, dateTime));
long minutes = seconds / 60;
long hours = seconds / 3600;
long days = seconds / 86400;
if (seconds < 60)
return (seconds == 1) ? "one second ago" : seconds + " seconds ago";
if (seconds < 3600)
return (minutes == 1) ? "a minute ago" : minutes + " minutes ago";
if (seconds < 86400)
return (hours == 1) ? "an hour ago" : hours + " hours ago";
if (seconds < 2592000) // 30 days
return (days == 1) ? "yesterday" : days + " days ago";
if (seconds < 31104000) { // 12 months
long months = days / 30;
return (months <= 1) ? "a month ago" : months + " months ago";
}
long years = days / 365;
return (years <= 1) ? "a year ago" : years + " years ago";
}
public static void test(double hoursAgo) {
long secondsAgo = Math.round(hoursAgo * 3600);
Instant past = Instant.now().minusSeconds(secondsAgo);
System.out.println(toRelativePastTime(past));
}
public static void main(String[] args) {
test(0.01); // 36 seconds ago
test(0.2); // 12 minutes ago
test(3); // 3 hours ago
test(25); // yesterday
test(360); // 15 days ago
test(1239); // a month ago
test(2239); // 3 months ago
test(8760); // a year ago
test(98763); // 11 years ago
}
}
/*
run:
36 seconds ago
12 minutes ago
3 hours ago
yesterday
15 days ago
a month ago
3 months ago
a year ago
11 years ago
*/