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

2 Answers

0 votes
using System;

public class Program
{
    public static string ToRelativePastTime(DateTime userDate) {
        var now = DateTime.UtcNow;
        var ts = now - userDate;

        bool isFuture = ts.TotalSeconds < 0;
        ts = ts.Duration(); // absolute value

        const int SECOND = 1;
        const int MINUTE = 60 * SECOND;
        const int HOUR = 60 * MINUTE;
        const int DAY = 24 * HOUR;
        const int MONTH = 30 * DAY;

        double delta = ts.TotalSeconds;

        string suffix = isFuture ? "from now" : "ago";

        if (delta < 1 * MINUTE)
            return ts.Seconds <= 1 ? $"one second {suffix}" : $"{ts.Seconds} seconds {suffix}";

        if (delta < 2 * MINUTE)
            return $"one minute {suffix}";

        if (delta < 45 * MINUTE)
            return $"{ts.Minutes} minutes {suffix}";

        if (delta < 90 * MINUTE)
            return $"one hour {suffix}";

        if (delta < 24 * HOUR)
            return $"{ts.Hours} hours {suffix}";

        if (delta < 48 * HOUR)
            return isFuture ? "tomorrow" : "yesterday";

        if (delta < 30 * DAY)
            return $"{ts.Days} days {suffix}";

        if (delta < 12 * MONTH)
        {
            int months = (int)Math.Floor(ts.Days / 30.0);
            return months <= 1 ? $"one month {suffix}" : $"{months} months {suffix}";
        }

        int years = (int)Math.Floor(ts.Days / 365.0);
        return years <= 1 ? $"one year {suffix}" : $"{years} years {suffix}";
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(DateTime.UtcNow);

        Console.WriteLine(ToRelativePastTime(new DateTime(2026, 04, 12, 19, 23, 11))); 
        Console.WriteLine(ToRelativePastTime(new DateTime(2026, 04, 12, 19, 05, 04))); 
        Console.WriteLine(ToRelativePastTime(new DateTime(2026, 04, 12, 11, 48, 00))); 
        Console.WriteLine(ToRelativePastTime(new DateTime(2026, 04, 11, 12, 00, 00))); 
        Console.WriteLine(ToRelativePastTime(new DateTime(2026, 04, 9, 12, 00, 00))); 
        Console.WriteLine(ToRelativePastTime(new DateTime(2025, 04, 26, 12, 00, 00))); 
        Console.WriteLine(ToRelativePastTime(new DateTime(2013, 04, 26, 12, 00, 00))); 
    }
}


/*
run:

04/12/2026 19:24:09
58 seconds ago
19 minutes ago
7 hours ago
yesterday
3 days ago
11 months ago
12 years ago

*/

 



answered Apr 25, 2024 by avibootz
edited Apr 12 by avibootz
0 votes
using System;
 
public class Program
{
    public static string ToRelativePastTime(DateTime dateTime) {
        var ts = DateTime.UtcNow - dateTime.ToUniversalTime();
        double delta = Math.Abs(ts.TotalSeconds);
     
        if (delta < 60)
            return ts.Seconds == 1 ? "one second ago" : ts.Seconds + " seconds ago";
     
        if (delta < 3600)
            return ts.Minutes == 1 ? "a minute ago" : ts.Minutes + " minutes ago";
     
        if (delta < 86400)
            return ts.Hours == 1 ? "an hour ago" : ts.Hours + " hours ago";
     
        if (delta < 2592000)
            return ts.Days == 1 ? "yesterday" : ts.Days + " days ago";
     
        if (delta < 31104000)
        {
            int months = Convert.ToInt32(Math.Floor((double)ts.Days / 30));
            return months <= 1 ? "a month ago" : months + " months ago";
        }
     
        int years = Convert.ToInt32(Math.Floor((double)ts.Days / 365));
         
        return years <= 1 ? "a year ago" : years + " years ago";
    }
 
    public static void Main(string[] args)
    {
        DateTime past = DateTime.Now.AddHours(-0.01);
        string 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);
    }
}
 
 
/*
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 12 by avibootz
edited Apr 12 by avibootz

Related questions

...