How to calculate relative past time from a given date & time (e.g., 3 hours ago, 5 days ago, a month ago) in Kotlin

1 Answer

0 votes
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

*/

 



answered Apr 13 by avibootz

Related questions

...