Uncategorized

Human-Friendly Dates


#region Human Friendly Dates

///

/// Takes instances of dates and converts them to more human-readable interpretations.
///

///
///
///
public static string ToHumanFriendlyDate(this DateTime date, bool neverShowSeconds = true)
{
TimeSpan ts = DateTime.Now.Subtract(date);
return ToHumanFriendlyDate(ts, neverShowSeconds);
}

///

/// Takes instances of dates and converts them to more human-readable interpretations.
///

///
///
///
public static string ToHumanFriendlyDate(this DateTime? date, bool neverShowSeconds = true)
{
if (date == null)
return null;
return ToHumanFriendlyDate(date.Value, neverShowSeconds);
}

///

/// Takes instances of dates and converts them to more human-readable interpretations.
///

///
///
///
public static string ToHumanFriendlyDate(this TimeSpan timespan, bool neverShowSeconds = true)
{
/* Examples of conversions:
* < 1m : Less than a minute [ago|to go]
* 1: A minute [ago|to go]
* 2: A couple minutes [ago|to go]
* 3-4: A few minutes [ago|to go]
* 5+: [min] minutes [ago|to go]
* 1 hour: An hour ago/to go
* 2 hours: A couple hours [ago/to go]
* Yesterday: Yesterday at 12:30 PM
* Tomorrow: Tomorrow at 12:30 pm
*/
bool isInFuture = timespan.TotalMinutes != Math.Abs(timespan.TotalMinutes);
Func endQualifier = () => isInFuture ? "to go" : "ago";
Func formatDateFunc = date => date.ToShortDateString().Replace("/" + DateTime.Now.Year, "");
if (Math.Abs(timespan.TotalSeconds) < 5)
{
return "A few seconds " + endQualifier();
}
else if (Math.Abs(timespan.TotalSeconds) < 60)
{
return "Less than a minute " + endQualifier();
}
else if (Math.Abs(timespan.TotalMinutes) < 3)
{
return "A couple minutes " + endQualifier();
}
else if (Math.Abs(timespan.TotalMinutes) < 5)
{
return "A few minutes " + endQualifier();
}
else if (Math.Abs(timespan.TotalMinutes) < 55)
{
return timespan.Minutes.ToString() + " minutes " + endQualifier();
}
else if (Math.Abs(timespan.TotalHours) < 1)
{
return "Less than an hour " + endQualifier();
}
else if (Math.Abs(timespan.TotalHours) < 2 && Math.Abs(timespan.Hours) == 1)
{
return "An hour " + endQualifier();
}
else if (Math.Abs(timespan.TotalHours) < 3)
{
return "A couple hours " + endQualifier();
}
else if (Math.Abs(timespan.TotalHours) < 5)
{
return "A few hours " + endQualifier();
}
else
{
string day;
DateTime d = DateTime.Now.Subtract(timespan);
if (Math.Abs(timespan.TotalDays) < 2)
{
if (d.Day DateTime.Now.Day)
{
day = "Tomorrow";
}
else
{
day = "Today";
}
}
else
{
day = formatDateFunc(d);
}
if (neverShowSeconds)
{
return day + ", " + d.ToString("h:mm tt").Replace(":00", "");
}
else
{
return day + ", " + d.ToShortTimeString().Replace(":00", "");
}
}
}

///

/// Takes instances of dates and converts them to more human-readable interpretations.
///

///
///
///
public static string ToHumanFriendlyDate(this TimeSpan? timespan, bool neverShowSeconds = true)
{
if (timespan == null)
return null;
return ToHumanFriendlyDate(timespan.Value, neverShowSeconds);
}

#endregion

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s