有没有办法在C#中设置AbbreviatedMonthNames的默认值?
e.g。在MSDN上,它为属性提供了以下用途:
CultureInfo ci = CultureInfo.CreateSpecificCulture("en-US");
DateTimeFormatInfo dtfi = ci.DateTimeFormat;
dtfi.AbbreviatedMonthNames = new string[] { "of Jan", "of Feb", "of Mar",
"of Apr", "of May", "of Jun",
"of Jul", "of Aug", "of Sep",
"of Oct", "of Nov", "of Dec", "" };
dtfi.AbbreviatedMonthGenitiveNames = dtfi.AbbreviatedMonthNames;
DateTime dat = new DateTime(2012, 5, 28);
for (int ctr = 0; ctr < dtfi.Calendar.GetMonthsInYear(dat.Year); ctr++)
Console.WriteLine(dat.AddMonths(ctr).ToString("dd MMM yyyy", dtfi));
但如果我只想使用
怎么办?Console.WriteLine(dat.AddMonths(ctr).ToString("dd MMM yyyy");
......让它使用当前的文化是什么?即无需创建dtfi
的新实例?
现在,似乎我目前的文化是en-GB然后它运作良好,但对于其他文化,它将月份缩写为数字。
答案 0 :(得分:1)
ToString()
(和格式等)需要一种文化来格式化日期/时间。它离不开它。因此,如果您没有通过明确的文化来使用,它只需要当前线程的默认文化。
幸运的是,您可以非常轻松地更改当前线程的文化 - 只需设置System.Threading.Thread.CurrentThread.CurrentCulture
即可。请注意,您可能想要简单地修改这种文化 - 但您无法做到。它是只读的。您需要首先Clone()
,然后修改克隆,然后重新设置它。
瞧!香草ToString()
现在使用您的特定设置。
var ci = Thread.CurrentThread.CurrentCulture.Clone();
var dtfi = ci.DateTimeFormat;
dtfi.AbbreviatedMonthNames = new string[] { "of Jan", "of Feb", "of Mar",
"of Apr", "of May", "of Jun",
"of Jul", "of Aug", "of Sep",
"of Oct", "of Nov", "of Dec", ""};
dtfi.AbbreviatedMonthGenitiveNames = dtfi.AbbreviatedMonthNames;
Thread.CurrentThread.CurrentCulture = ci;
当然,每个帖子只需要执行一次。
答案 1 :(得分:0)
以下是您可以构建string.Format
来获取所需格式的方式:
string.Format("{0:dd} of {0:MMM yyyy}", myDate);
在您的代码中,它看起来像这样:
for (int ctr = 0; ctr < dtfi.Calendar.GetMonthsInYear(dat.Year); ctr++)
{
var myDate = dat.AddMonths(ctr);
Console.WriteLine(string.Format("{0:dd} of {0:MMM yyyy}", myDate))
}
答案 2 :(得分:0)
您可以通过创建该月的日期并格式化结果来获取月份名称
dtfi.AbbreviatedMonthNames = new string[12];
for (int m = 1; m <= 12; m++) {
dtfi.AbbreviatedMonthNames[m] = new DateTime(2015, m, 1).ToString("MMM");
}