How to get a Long Date format from DateTime without a weekday
This seemed to do the trick.
- Enumerate all valid datetime patterns: CultureInfo.DateTimeFormat.GetAllDateTimePatterns
- Select longest pattern (presumably this is the best match) that:
- Is a substring of the CultureInfo.DateTimeFormat.LongDatePattern
- Does not contain "ddd" (short day name)
- Does not contain "dddd" (long day name)
This appears to come up with the strings I was looking for.
See code below:
class DateTest
{
static private string GetDatePatternWithoutWeekday(CultureInfo cultureInfo)
{
string[] patterns = cultureInfo e.DateTimeFormat.GetAllDateTimePatterns();
string longPattern = cultureInfo.DateTimeFormat.LongDatePattern;
string acceptablePattern = String.Empty;
foreach (string pattern in patterns)
{
if (longPattern.Contains(pattern) && !pattern.Contains("ddd") && !pattern.Contains("dddd"))
{
if (pattern.Length > acceptablePattern.Length)
{
acceptablePattern = pattern;
}
}
}
if (String.IsNullOrEmpty(acceptablePattern))
{
return longPattern;
}
return acceptablePattern;
}
static private void Test(string locale)
{
DateTime dateTime = new DateTime(2009, 12, 5);
Thread.CurrentThread.CurrentCulture = new CultureInfo(locale);
string format = GetDatePatternWithoutWeekday(Thread.CurrentThread.CurrentCulture);
string result = dateTime.ToString(format);
MessageBox.Show(result);
}
}
Technically, it probably wouldn't work if a long format had the name of the day sandwiched in the middle. For that, I should choose the pattern with longest common substring instead of longest exact match.
Improving on the accepted answer, GetAllDateTimePatterns
can take a parameter to restrict the result to patterns relating to a standard format string, such as 'D' for the long date pattern.
For example, GetAllDateTimePatterns('D')
is currently returning this for en-US:
"dddd, MMMM d, yyyy", "MMMM d, yyyy", "dddd, d MMMM, yyyy", "d MMMM, yyyy"
and this for zh-HK:
"yyyy'年'M'月'd'日'", "yyyy'年'MM'月'dd'日'", "yyyy年MMMd日", "yyyy年MMMd日, dddd"
Assuming they're listed in some order of preference or prevalence, we can select the first option that does not contain the day of the week.
Here are extension methods so you can simply use myDateTime.ToLongDateStringWithoutDayOfWeek()
and myDateTime.ToLongDateTimeStringWithoutDayOfWeek()
.
public static string ToLongDateStringWithoutDayOfWeek(this DateTime d)
{
return d.ToString(
CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns('D')
.FirstOrDefault(a => !a.Contains("ddd") && !a.Contains("dddd"))
?? "D");
}
public static string ToLongDateTimeStringWithoutDayOfWeek(this DateTime d, bool includeSeconds = false)
{
char format = includeSeconds ? 'F' : 'f';
return d.ToString(
CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns(format)
.FirstOrDefault(a => !a.Contains("ddd") && !a.Contains("dddd"))
?? format.ToString());
}
String formattedDate = DateTime.Now.Date.ToLongDateString().Replace(DateTime.Now.DayOfWeek.ToString()+ ", ", "")
A very awful, horrible way to accomplish this is to remove the format specifiers you don't want from the existing LongDatePattern:
public static string CorrectedLongDatePattern(CultureInfo cultureInfo)
{
var info = cultureInfo.DateTimeFormat;
// This is bad, mmmkay?
return Regex.Replace(info.LongDatePattern, "dddd,?",String.Empty).Trim();
}