如何设置 "default" AbbreviatedMonthNames? (C#)
How to set "default" AbbreviatedMonthNames? (C#)
有没有办法在 C# 中设置 AbbreviatedMonthNames 的默认值?
例如在 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,那么它就可以正常工作,但对于其他文化,它会将月份缩写为数字。
您可以通过以下方式构建 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))
}
您可以通过创建月份的日期并格式化结果来获取月份名称
dtfi.AbbreviatedMonthNames = new string[12];
for (int m = 1; m <= 12; m++) {
dtfi.AbbreviatedMonthNames[m] = new DateTime(2015, m, 1).ToString("MMM");
}
ToString()
(和格式等)需要一种文化来格式化 dates/times。离不开它。因此,如果您不传递要使用的显式文化,它只会采用当前线程的默认文化。
幸运的是,您可以很容易地更改当前线程的文化 - 只需先设置 System.Threading.Thread.CurrentThread.CurrentCulture
. Note that you might be tempted to simply modify that culture - but you can't. It's read-only. You need to Clone()
,然后修改克隆,然后再将其设置回去。
瞧! Vanilla 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;
当然,每个线程只需要执行一次。
有没有办法在 C# 中设置 AbbreviatedMonthNames 的默认值?
例如在 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,那么它就可以正常工作,但对于其他文化,它会将月份缩写为数字。
您可以通过以下方式构建 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))
}
您可以通过创建月份的日期并格式化结果来获取月份名称
dtfi.AbbreviatedMonthNames = new string[12];
for (int m = 1; m <= 12; m++) {
dtfi.AbbreviatedMonthNames[m] = new DateTime(2015, m, 1).ToString("MMM");
}
ToString()
(和格式等)需要一种文化来格式化 dates/times。离不开它。因此,如果您不传递要使用的显式文化,它只会采用当前线程的默认文化。
幸运的是,您可以很容易地更改当前线程的文化 - 只需先设置 System.Threading.Thread.CurrentThread.CurrentCulture
. Note that you might be tempted to simply modify that culture - but you can't. It's read-only. You need to Clone()
,然后修改克隆,然后再将其设置回去。
瞧! Vanilla 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;
当然,每个线程只需要执行一次。