我在使用Datetime.ParseExact方法,它需要一个IFormatProvider...
它可以输入null,但是它到底做了什么呢?
发布于 2009-02-04 13:13:48
除了Ian Boyd的回答:
此外,CultureInfo还实现了此接口,并且可以在您的案例中使用。例如,您可以解析一个法语日期字符串;您可以使用
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);发布于 2013-08-13 03:41:57
IFormatProvider接口通常由CultureInfo类实现,例如:
CultureInfo.CurrentCultureCultureInfo.CurrentUICultureCultureInfo.InvariantCultureCultureInfo.CreateSpecificCulture("de-CA") //German (Canada)接口是函数从区域性获取一组特定于区域性的数据的网关。可以查询IFormatProvider的两个常用区域性对象是:
它通常的工作方式是请求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中运行,并且您可以保留习惯用法。
实际上,您永远不需要自己调用IFormatProvider的GetFormat方法。
无论何时需要IFormatProvider,都可以传递一个CultureInfo对象:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));Note:任何代码都会发布到公共领域。不需要属性。
发布于 2013-01-07 19:26:43
将null作为IFormatProvider传递不是正确的方法。如果用户在他们的PC上有一个自定义的日期/时间格式,那么在解析和转换为字符串时就会出现问题。我刚刚修复了一个错误,在转换为字符串时,有人将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);https://stackoverflow.com/questions/506676
复制相似问题