11

You may have noticed that certain web applications (for example, certain parts of GMail) display dates in a more human-readable format than simply DD/MM/YYYY.

For example, if I open up a mail item from the 23rd (which happens to be 3 days ago at the time of writing, I'll get the following:

Dec 23 (3 days ago)

I'd like to implement similar logic to this in my own web application.

For example, when dealing with a .NET TimeSpan object, I'd like to convert it to text such as the following:

2 months

3 days

Is there a .NET library capable of doing this already?

If not I might build something basic and open-source it.


I've made a basic start here:

public static class TimeSpanHelpers
{
    public static string ToHumanReadableString(
        this TimeSpan timeSpan)
    {
        if (timeSpan.TotalDays > 30)
            return (timeSpan.TotalDays / 30) + " month(s)";

        if (timeSpan.TotalDays > 7)
            return (timeSpan.TotalDays / 7) + " week(s)";

        return (timeSpan.TotalDays) + " day(s)";
    }
}
Community
  • 1
  • 1
Jonathan
  • 32,202
  • 38
  • 137
  • 208
  • 3
    See: http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time – Christian C. Salvadó Dec 26 '09 at 07:21
  • Awesome... I knew someone would be asking this but couldn't figure out what terms to type into the search box. – Jonathan Dec 26 '09 at 07:38
  • I've got a simple algorithm for that on my blog that you could extend: http://www.robfe.com/2009/09/timeago-for-csharp/ Not very different to yours I'm afraid... – Rob Fonseca-Ensor Dec 26 '09 at 07:27
  • See also this question: http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time There you'll find several C# implementations for relative time (i.e. "5 mins ago", "10 days ago"). – Juha Syrjälä Dec 26 '09 at 10:32

4 Answers4

14

Try Humanizer http://humanizr.net/

TimeSpan.FromMilliseconds(1299630020).Humanize(3) => "2 weeks, 1 day, 1 hour"

// in de-DE culture
TimeSpan.FromDays(1).Humanize() => "Ein Tag"
TimeSpan.FromDays(2).Humanize() => "2 Tage"

// in sk-SK culture
TimeSpan.FromMilliseconds(1).Humanize() => "1 milisekunda"

// and a lot more
DateTime.UtcNow.AddHours(2).Humanize() => "2 hours from now"
"case".ToQuantity(5) => "5 cases"
"man".ToQuantity(2) => "2 men"
122.ToWords() => "one hundred and twenty-two"
(.5).Gigabytes().Humanize() => "512 MB"
"Long text to truncate".Truncate(10) => "Long text…",
"Sentence casing".Transform(To.TitleCase) => "Sentence Casing"

Nuget:

Install-Package Humanizer
Sam7
  • 3,382
  • 2
  • 34
  • 57
7

The Noda Time group is in the process of doing just this. Come on over and join the fun. Forgot to mention the project location Noda Time project

User 12345678
  • 7,714
  • 2
  • 28
  • 46
James Keesey
  • 1,218
  • 9
  • 13
1

Another library for doing this: http://relativetime.codeplex.com/

(Available on NuGet)

Jonathan
  • 32,202
  • 38
  • 137
  • 208
0

I ended up using this method as I needed to support future dates like 3 days from now.

Community
  • 1
  • 1
Matthew Lock
  • 13,144
  • 12
  • 92
  • 130