Getting day suffix when using DateTime.ToString()
As a reference I always use/refer to [SteveX String Formatting] 1 and there doesn't appear to be any "th" in any of the available variables but you could easily build a string with
string.Format("{0:dddd dd}{1} {0:MMMM yyyy}", DateTime.Now, (?));
You would then have to supply a "st" for 1, "nd" for 2, "rd" for 3, and "th" for all others and could be in-lined with a "? :" statement.
var now = DateTime.Now;
(now.Day % 10 == 1 && now.Day % 100 != 11) ? "st"
: (now.Day % 10 == 2 && now.Day % 100 != 12) ? "nd"
: (now.Day % 10 == 3 && now.Day % 100 != 13) ? "rd"
: "th"
Using a couple of extension methods:
namespace System
{
public static class IntegerExtensions
{
public static string ToOccurrenceSuffix(this int integer)
{
switch (integer % 100)
{
case 11:
case 12:
case 13:
return "th";
}
switch (integer % 10)
{
case 1:
return "st";
case 2:
return "nd";
case 3:
return "rd";
default:
return "th";
}
}
}
public static class DateTimeExtensions
{
public static string ToString(this DateTime dateTime, string format, bool useExtendedSpecifiers)
{
return useExtendedSpecifiers
? dateTime.ToString(format)
.Replace("nn", dateTime.Day.ToOccurrenceSuffix().ToLower())
.Replace("NN", dateTime.Day.ToOccurrenceSuffix().ToUpper())
: dateTime.ToString(format);
}
}
}
Usage:
return DateTime.Now.ToString("dddd, dnn MMMM yyyy", useExtendedSpecifiers: true);
// Friday, 7th March 2014
Note: The integer extension method can be used for any number, not just 1 to 31. e.g.
return 332211.ToOccurrenceSuffix();
// th
Another option using switch:
string GetDaySuffix(int day)
{
switch (day)
{
case 1:
case 21:
case 31:
return "st";
case 2:
case 22:
return "nd";
case 3:
case 23:
return "rd";
default:
return "th";
}
}