How to format a date as localized Short MonthDay string
I would like to format a DateTime to a string containing the month name abbreviated and the date for use in axis labels in a graph.
The default DateTime format strings do not contain abbreviated month. I guess there is no standard but I could take a substring of the first 3 characters of the month name and replace this into the MonthDay format. The reason I would use MonthDay is that the ordering of month and date is locale dependent.
Does anyone have a better idea?
h开发者_如何学Cttp://msdn.microsoft.com/en-us/library/az4se3k1.aspx#MonthDay
You could take the MonthDay
pattern and replace "MMMM" with "MMM" - then apply that pattern:
string pattern = CultureInfo.CurrentCulture.DateTimeFormat.MonthDayPattern;
pattern = pattern.Replace("MMMM", "MMM");
string formatted = dateTime.ToString(pattern);
It's somewhat crude, but I believe it would work.
You can use the custom string formatters to do this:
DateTime now = DateTime.Now;
Console.WriteLine("{0}", now.ToString("ddd MMMM dd"));
See the section "How Standard Format Strings Work" on the page you linked to for more info.
You can pass a CultureInfo in the Date.ToString() method. Either you have a specific culture info or you can use the CultureInfo.CurrentCulture:
var date = DateTime.Now;
var ci = new CultureInfo("de-CH");
var output = date.ToString("d MMM", ci);
Edited: Use date.ToString("d MMM")
. It will show 7 sep.
Here is the solution I came up with for the similar situation of wanting a localized version of 01/29
:
Regex.Replace(c.DateTimeFormat.ShortDatePattern, @"(yy(yy)?[/\.\- ]|[/\.\- ]yy(yy)?)", "")
Here is the format output for all cultures, so you can see if it will work for you:
CultureInfo.GetCultures(CultureTypes.AllCultures)
.Select(c => new {
c.Name,
c.DateTimeFormat.MonthDayPattern,
c.DateTimeFormat.ShortDatePattern,
DayMonth1 = Regex.Replace(c.DateTimeFormat.ShortDatePattern, @"[/\.\- ]?yy[/\.\- ]?", ""),
DayMonth2 = Regex.Replace(c.DateTimeFormat.ShortDatePattern, @"(yyyy[/\.\- ]|[/\.\- ]yyyy|yy[/\.\- ]|[/\.\- ]yy)", ""),
DayMonth3 = Regex.Replace(c.DateTimeFormat.ShortDatePattern, @"(yy(yy)?[/\.\- ]|[/\.\- ]yy(yy)?)", "")
})
.OrderBy(x => x.Name)
.Dump();
The DateMonth1
replace will remove an extra padding character for a couple cultures (specifically 'bg').
Quick, easy and does the job.
CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(Month).Substring(0,3);
精彩评论