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

2 Answers

0 votes
Imports System

Public Class Program

    Public Shared Function ToRelativePastTime(userDate As DateTime) As String
        Dim now = DateTime.UtcNow
        Dim ts = now - userDate

        Dim isFuture As Boolean = ts.TotalSeconds < 0
        ts = ts.Duration() ' absolute value

        Const SECOND As Integer = 1
        Const MINUTE As Integer = 60 * SECOND
        Const HOUR As Integer = 60 * MINUTE
        Const DAY As Integer = 24 * HOUR
        Const MONTH As Integer = 30 * DAY

        Dim delta As Double = ts.TotalSeconds

        Dim suffix As String = If(isFuture, "from now", "ago")

        If delta < 1 * MINUTE Then
            Return If(ts.Seconds <= 1,
                      $"one second {suffix}",
                      $"{ts.Seconds} seconds {suffix}")
        End If

        If delta < 2 * MINUTE Then
            Return $"one minute {suffix}"
        End If

        If delta < 45 * MINUTE Then
            Return $"{ts.Minutes} minutes {suffix}"
        End If

        If delta < 90 * MINUTE Then
            Return $"one hour {suffix}"
        End If

        If delta < 24 * HOUR Then
            Return $"{ts.Hours} hours {suffix}"
        End If

        If delta < 48 * HOUR Then
            Return If(isFuture, "tomorrow", "yesterday")
        End If

        If delta < 30 * DAY Then
            Return $"{ts.Days} days {suffix}"
        End If

        If delta < 12 * MONTH Then
            Dim months As Integer = CInt(Math.Floor(ts.Days / 30.0))
            Return If(months <= 1,
                      $"one month {suffix}",
                      $"{months} months {suffix}")
        End If

        Dim years As Integer = CInt(Math.Floor(ts.Days / 365.0))
        Return If(years <= 1,
                  $"one year {suffix}",
                  $"{years} years {suffix}")
    End Function


    Public Shared Sub Main(args As String())
        Console.WriteLine(DateTime.UtcNow)
		
		Console.WriteLine(ToRelativePastTime(New DateTime(2026, 4, 13, 7, 29, 9)))
        Console.WriteLine(ToRelativePastTime(New DateTime(2026, 4, 13, 7, 27, 11)))
        Console.WriteLine(ToRelativePastTime(New DateTime(2026, 4, 13, 19, 5, 4)))
        Console.WriteLine(ToRelativePastTime(New DateTime(2026, 4, 13, 11, 48, 0)))
        Console.WriteLine(ToRelativePastTime(New DateTime(2026, 4, 9, 12, 0, 0)))
        Console.WriteLine(ToRelativePastTime(New DateTime(2025, 4, 26, 12, 0, 0)))
        Console.WriteLine(ToRelativePastTime(New DateTime(2013, 4, 26, 12, 0, 0)))
    End Sub

End Class

 
 
' run:
'
' 04/13/2026 07:29:33
' 24 seconds ago
' 2 minutes ago
' 11 hours from now
' 4 hours from now
' 3 days ago
' 11 months ago
' 12 years ago
'

 



answered Apr 26, 2024 by avibootz
edited Apr 13 by avibootz
0 votes
Imports System

Public Class Program

    Public Shared Function ToRelativePastTime(dateTime As DateTime) As String
        Dim ts As TimeSpan = DateTime.UtcNow - dateTime.ToUniversalTime()
        Dim delta As Double = Math.Abs(ts.TotalSeconds)

        If delta < 60 Then
            Return If(ts.Seconds = 1,
                      "one second ago",
                      ts.Seconds & " seconds ago")
        End If

        If delta < 3600 Then
            Return If(ts.Minutes = 1,
                      "a minute ago",
                      ts.Minutes & " minutes ago")
        End If

        If delta < 86400 Then
            Return If(ts.Hours = 1,
                      "an hour ago",
                      ts.Hours & " hours ago")
        End If

        If delta < 2592000 Then
            Return If(ts.Days = 1,
                      "yesterday",
                      ts.Days & " days ago")
        End If

        If delta < 31104000 Then
            Dim months As Integer = CInt(Math.Floor(ts.Days / 30.0))
            Return If(months <= 1,
                      "a month ago",
                      months & " months ago")
        End If

        Dim years As Integer = CInt(Math.Floor(ts.Days / 365.0))
        Return If(years <= 1,
                  "a year ago",
                  years & " years ago")
    End Function


    Public Shared Sub Main(args As String())
        Dim past As DateTime
        Dim result As String

        past = DateTime.Now.AddHours(-0.01)
        result = ToRelativePastTime(past)
        Console.WriteLine(result)

        past = DateTime.Now.AddHours(-0.2)
        result = ToRelativePastTime(past)
        Console.WriteLine(result)

        past = DateTime.Now.AddHours(-3)
        result = ToRelativePastTime(past)
        Console.WriteLine(result)

        past = DateTime.Now.AddHours(-25)
        result = ToRelativePastTime(past)
        Console.WriteLine(result)

        past = DateTime.Now.AddHours(-360)
        result = ToRelativePastTime(past)
        Console.WriteLine(result)

        past = DateTime.Now.AddHours(-1239)
        result = ToRelativePastTime(past)
        Console.WriteLine(result)

        past = DateTime.Now.AddHours(-2239)
        result = ToRelativePastTime(past)
        Console.WriteLine(result)

        past = DateTime.Now.AddHours(-8760)
        result = ToRelativePastTime(past)
        Console.WriteLine(result)

        past = DateTime.Now.AddHours(-98763)
        result = ToRelativePastTime(past)
        Console.WriteLine(result)
    End Sub

End Class


 
 
' 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

...