我正在使用 Datetime.ParseExact 方法,它需要一个 IFormatProvider...

输入 null 就可以了,但是它到底有什么作用呢?

有帮助吗?

解决方案

在ADITION伊恩·博伊德的回答是:

另外CultureInfo实现该接口,可以在你的情况中使用。所以,你可以解析例如法国的日期字符串;你可以使用

var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);

其他提示

IFormatProvider 接口通常由一个为您实现 CultureInfo 类,例如:

  • CultureInfo.CurrentCulture
  • CultureInfo.CurrentUICulture
  • CultureInfo.InvariantCulture
  • CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)

该接口是函数从文化获取一组特定于文化的数据的网关。两种常见的文化对象 IFormatProvider 可以查询到的有:

  • DateTimeFormatInfo
  • NumberFormatInfo

通常的工作方式是你问 IFormatProvider 给你一个 DateTimeFormatInfo 目的:

DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
   DoStuffWithDatesOrTimes(format);

还有内部知识,任何 IFormatProvider 接口很可能由派生自的类实现 CultureInfo, ,或下降自 DateTimeFormatInfo, ,所以你可以直接转换接口:

CultureInfo info = provider as CultureInfo;
if (info != null)
   format = info.DateTimeInfo;
else
{
   DateTimeFormatInfo dtfi = provider as DateTimeFormatInfo;
   if (dtfi != null)
       format = dtfi;
   else
       format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
}

if (format != null)
   DoStuffWithDatesOrTimes(format);

但不要这样做

所有的辛苦工作都已经为您写好了:

为了得到一个 DateTimeFormatInfo 从一个 IFormatProvider:

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

为了得到一个 NumberFormatInfo 从一个 IFormatProvider:

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

的价值 IFormatProvider 就是你创造自己的文化对象。只要他们落实 IFormatProvider, ,并返回他们要求的对象,您可以绕过内置区域性。

您还可以使用 IFormatProvider 一种传递任意文化对象的方式 - 通过 IFormatProvider. 。例如。不同文化中神的名字

  • 上帝
  • 上帝
  • 耶霍瓦
  • 耶和华
  • יהוה
  • אהיה אשר אהיה

这让您的定制 LordsNameFormatInfo 类在里面行驶 IFormatProvider, ,并且您可以保留该习语。

事实上你永远不需要打电话 GetFormat 的方法 IFormatProvider 你自己。

每当你需要一个 IFormatProvider 你可以通过 CultureInfo 目的:

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));

笔记: :任何代码都会发布到公共领域。无需归属。

空传递作为IFormatProvider是不这样做的正确方法。如果用户拥有自己的个人电脑上的自定义日期/时间格式,你会在解析和转换为字符串的问题。我刚刚固定转换为字符串时,其中有人已通过null作为的IFormatProvider的错误。

相反,你应该使用CultureInfo.InvariantCulture

错:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);

正确:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);

您可以在这里看到 http://msdn.microsoft.com/ EN-US /库/ system.iformatprovider.aspx

请参阅上述表示的和实施例部分在那里。

的IFormatProvider 提供文化信息到所讨论的方法。 的DateTimeFormatInfo 实现的IFormatProvider,并允许您指定格式要在要显示你的日期/时间。例如可以在MSDN上的相关网页上找到。

经过 微软软件定义网络

.NET框架包括以下内容 预定义的 IFormatProvider 实现提供用于格式化或解析数字、日期和时间值的区域性特定信息:

  1. NumberFormatInfo 类,它提供用于格式化数字的信息,例如特定区域性的货币、千位分隔符和小数分隔符符号。有关由 a 识别的预定义格式字符串的信息 NumberFormatInfo 对象并用于数字格式化操作,请参阅标准数字格式字符串和自定义数字格式字符串。
  2. DateTimeFormatInfo 类,它提供用于格式化日期和时间的信息,例如特定区域性的日期和时间分隔符或日期的年、月和日组成部分的顺序和格式。有关由 a 识别的预定义格式字符串的信息 DateTimeFormatInfo 对象并用于数字格式化操作,请参阅标准日期和时间格式字符串和自定义日期和时间格式字符串。
  3. CultureInfo 阶级,代表一种特定的文化。它是 GetFormat 方法返回特定于文化的 NumberFormatInfo 或者 DateTimeFormatInfo 对象,取决于是否 CultureInfo 对象用于涉及数字或日期和时间的格式化或解析操作。

.NET Framework 还支持自定义格式。这通常涉及创建实现 IFormatProvider 和 ICustomFormatter 的格式化类。然后,此类的实例作为参数传递给执行自定义格式化操作的方法,例如 String.Format(IFormatProvider, String, Object[]).

的DateTimeFormatInfo 类实现此界面,因此它允许您控制您的日期时间字符串的格式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top