DateTime格式字符串中是否可以仅包含本月的第一个字母?

new DateTime(2015, 1, 12).ToString("M-dd-yy") // "1-12-15",  but I want "J-02-15"
new DateTime(2000, 11, 7).ToString("M-dd-yy") // "11-07-00", but I want "N-17-00"

如果没有,是否有某种方法可以向系统范围的IFormatProvider添加新的自定义格式来处理此问题?

请注意“您为什么要尝试这种方式?” people:这是用于供应商的图表控件,它仅接受格式字符串。我们正在尝试使这些日期尽可能短,并且这些日期是针对国际用户的,因此该月的数字将无效。我无法传递新的IFormatProvider,所以我必须以某种方式修改现有的IFormatProvider (希望不会破坏它)。

最佳答案

这是使用自定义FormatProvider的解决方案:

    public static class SingleLetterMonthNameFormatter
    {
        private static IFormatProvider _formatProvider;
        public static IFormatProvider FormatProvider
        {
            get
            {
                if (_formatProvider == null)
                {
                    var dtfi = new DateTimeFormatInfo();
                    dtfi.AbbreviatedMonthNames = dtfi.MonthNames.Select(x => x.FirstOrDefault().ToString()).ToArray();
                    _formatProvider = dtfi;
                }
                return _formatProvider;
            }
        }
    }

您可以像这样使用它:
var monthName = DateTime.Now.ToString("MMM", SingleLetterMonthNameFormatter.FormatProvider) //First letter of month name

如果无法将FormatProvider传递给所需的方法,则有一种讨厌的方法,请谨慎使用!
    var currentCulture = Thread.CurrentThread.CurrentCulture.Clone() as CultureInfo;
    currentCulture.DateTimeFormat = SingleLetterMonthNameFormatter.FormatProvider as DateTimeFormatInfo;
    Thread.CurrentThread.CurrentCulture = currentCulture;
    Console.WriteLine(DateTime.Now.ToString("MMM"));

关于c# - 带有自定义IFormatProvider的DateTime.ToString()中的月份的第一个字母,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29708626/

10-10 23:39