gpt4 book ai didi

c# - 如何为 DateTime 创建和使用自定义 IFormatProvider?

转载 作者:IT王子 更新时间:2023-10-29 04:38:20 25 4
gpt4 key购买 nike

我试图创建一个 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"

我不明白不同的结果。有人可以解释一下吗?

谢谢!

最佳答案

简短的解释是,虽然

DateTime.ToString(string format, IFormatProvider provider)

让你传递任何实现 IFormatProvider 作为其参数之一,它实际上只支持 2 种可能的类型在其代码中实现 IFormatProvider:

DateTimeFormatInfoCultureInfo

如果您的参数不能(使用 as)转换为其中之一或那些,该方法将默认为 CurrentCulture

String.Format 不受此类限制。

关于c# - 如何为 DateTime 创建和使用自定义 IFormatProvider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2382154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com