import java.time.Duration
import java.time.Instant
fun toRelativePastTime(past: Instant): String {
val now = Instant.now()
val delta = Duration.between(past, now).abs()
val seconds = delta.seconds
val minutes = seconds / 60
val hours = seconds / 3600
val days = seconds / 86400
return when {
seconds < 60 ->
if (seconds == 1L) "one second ago" else "$seconds seconds ago"
seconds < 3600 ->
if (minutes == 1L) "a minute ago" else "$minutes minutes ago"
seconds < 86400 ->
if (hours == 1L) "an hour ago" else "$hours hours ago"
seconds < 2_592_000 -> // 30 days
if (days == 1L) "yesterday" else "$days days ago"
seconds < 31_104_000 -> { // 12 months
val months = days / 30
if (months <= 1L) "a month ago" else "$months months ago"
}
else -> {
val years = days / 365
if (years <= 1L) "a year ago" else "$years years ago"
}
}
}
fun test(hoursAgo: Double) {
val secondsAgo = (hoursAgo * 3600).toLong()
val past = Instant.now().minusSeconds(secondsAgo)
println(toRelativePastTime(past))
}
fun main() {
test(0.01) // 36 seconds ago
test(0.2) // 12 minutes ago
test(3.0) // 3 hours ago
test(25.0) // yesterday
test(360.0) // 15 days ago
test(1239.0) // a month ago
test(2239.0) // 3 months ago
test(8760.0) // a year ago
test(98763.0) // 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
*/