DEV Community

Ricardo
Ricardo

Posted on • Originally published at rmauro.dev on

5

Calculate Time Ago with C#

Calculate Time Ago with C#

Here is a small extension method over System.DateTime that gives its relative time readable for humans, such as:

  • one minute ago
  • 2 minutes ago
  • one hour ago
  • 3 hours ago
  • 3 days ago

Check out this extension method over the DateTime structure using switch patterns.

public static string AsTimeAgo(this DateTime dateTime)
{
    TimeSpan timeSpan = DateTime.Now.Subtract(dateTime);

    return timeSpan.TotalSeconds switch
    {
        <= 60 => $"{timeSpan.Seconds} seconds ago",

        _ => timeSpan.TotalMinutes switch
        {
            <= 1 => "about a minute ago",
            < 60 => $"about {timeSpan.Minutes} minutes ago",
            _ => timeSpan.TotalHours switch
            {
                <= 1 => "about an hour ago",
                < 24 => $"about {timeSpan.Hours} hours ago",
                _ => timeSpan.TotalDays switch
                {
                    <= 1 => "yesterday",
                    <= 30 => $"about {timeSpan.Days} days ago",

                    <= 60 => "about a month ago",
                    < 365 => $"about {timeSpan.Days / 30} months ago",

                    <= 365 * 2 => "about a year ago",
                    _ => $"about {timeSpan.Days / 365} years ago"
                }
            }
        }
    };
}
Enter fullscreen mode Exit fullscreen mode

Extension method AsTimeAgo

Bonus! Different solutions for the same problem

Surfing the web - I'm so old - I found two more solutions for the same problem.

Tell me in the comments section which one you like the best.

First Solution

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

var ts = new TimeSpan(DateTime.UtcNow.Ticks - yourDate.Ticks);
double delta = Math.Abs(ts.TotalSeconds);

if (delta < 1 * MINUTE)
  return ts.Seconds == 1 ? "one second ago" : ts.Seconds + " seconds ago";

if (delta < 2 * MINUTE)
  return "a minute ago";

if (delta < 45 * MINUTE)
  return ts.Minutes + " minutes ago";

if (delta < 90 * MINUTE)
  return "an hour ago";

if (delta < 24 * HOUR)
  return ts.Hours + " hours ago";

if (delta < 48 * HOUR)
  return "yesterday";

if (delta < 30 * DAY)
  return ts.Days + " days ago";

if (delta < 12 * MONTH)
{
  int months = Convert.ToInt32(Math.Floor((double)ts.Days / 30));
  return months <= 1 ? "one month ago" : months + " months ago";
}
else
{
  int years = Convert.ToInt32(Math.Floor((double)ts.Days / 365));
  return years <= 1 ? "one year ago" : years + " years ago";
}

Enter fullscreen mode Exit fullscreen mode

Found on https://stackoverflow.com/questions/11/calculate-relative-time-in-c-sharp

Second Solution

public static string TimeAgo(this DateTime dateTime)
{
    string result = string.Empty;
    var timeSpan = DateTime.Now.Subtract(dateTime);

    if (timeSpan <= TimeSpan.FromSeconds(60))
    {
        result = string.Format("{0} seconds ago", timeSpan.Seconds);
    }
    else if (timeSpan <= TimeSpan.FromMinutes(60))
    {
        result = timeSpan.Minutes > 1 ? 
            String.Format("about {0} minutes ago", timeSpan.Minutes) :
            "about a minute ago";
    }
    else if (timeSpan <= TimeSpan.FromHours(24))
    {
        result = timeSpan.Hours > 1 ? 
            String.Format("about {0} hours ago", timeSpan.Hours) : 
            "about an hour ago";
    }
    else if (timeSpan <= TimeSpan.FromDays(30))
    {
        result = timeSpan.Days > 1 ? 
            String.Format("about {0} days ago", timeSpan.Days) : 
            "yesterday";
    }
    else if (timeSpan <= TimeSpan.FromDays(365))
    {
        result = timeSpan.Days > 30 ? 
            String.Format("about {0} months ago", timeSpan.Days / 30) : 
            "about a month ago";
    }
    else
    {
        result = timeSpan.Days > 365 ? 
            String.Format("about {0} years ago", timeSpan.Days / 365) : 
            "about a year ago";
    }

    return result;
}

Enter fullscreen mode Exit fullscreen mode

Found on https://dotnetthoughts.net/time-ago-function-for-c/

❤️ Enjoy this article?

Forward to a friend and let them know.

Leave a comment with questions or improvements.

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

Top comments (3)

Collapse
 
galdin profile image
Galdin Raphael

If you've not seen this already, there's also github.com/Humanizr/Humanizer :)

Collapse
 
rmaurodev profile image
Ricardo

I haven’t seen it before. I love it.
Thanks for sharing

Collapse
 
devmando profile image
CodeFilez

Pretty cool :)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs