我试图创建一个实现IFormatProvider
接口的对象,以识别DateTime对象的自定义格式字符串。这是我的实现代码:
public class MyDateFormatProvider : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
{
return this;
}
return null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if(arg == null) throw new ArgumentNullException("arg");
if (arg.GetType() != typeof(DateTime)) return arg.ToString();
DateTime date = (DateTime)arg;
switch(format)
{
case "mycustomformat":
switch(CultureInfo.CurrentCulture.Name)
{
case "en-GB":
return date.ToString("ddd dd MMM");
default:
return date.ToString("ddd MMM dd");
}
default:
throw new FormatException();
}
}
我本以为可以在DateTime.ToString(string format, IFormatProvider provider)
方法中使用它,类似于这样,但是:
DateTime d = new DateTime(2000, 1, 2);
string s = d.ToString("mycustomformat", new MyDateFormatProvider());
在这个例子中,以美国文化方式运行时,得到的结果是"00cu0Ao00or0aA"
。看起来是因为解释了标准的DateTime格式字符串。
然而,当我按照以下方式使用相同的类:DateTime d = new DateTime(2000, 1, 2);
string s = String.Format(new MyDateFormatProvider(), "{0:mycustomformat}", d);
我得到了我所期望的结果,即"Sun Jan 02"
我不明白这些不同的结果。有人能解释一下吗?
谢谢!