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
*/