如何设置 "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;

当然,每个线程只需要执行一次。