我正在使用Datetime.ParseExact方法,它需要一个IFormatProvider ...
它可以输入null,但它到底是做什么的?
对Ian Boyd的回答是:
还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
.例如不同文化中的上帝之名
神
神
Jehova
Yahwe
יהוה
אהיהאשראהיה
这可以让你的自定义LordsNameFormatInfo
课程在里面骑行IFormatProvider
,你可以保留成语.
实际上,你永远不需要调用自己的GetFormat
方法IFormatProvider
.
无论什么时候需要,IFormatProvider
你都可以传递一个CultureInfo
对象:
DateTime.Now.ToString(CultureInfo.CurrentCulture); endTime.ToString(CultureInfo.InvariantCulture); transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
注意:任何代码都将发布到公共域中.无需归属.
传递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);
IFormatProvider为相关方法提供文化信息.DateTimeFormatInfo实现IFormatProvider,并允许您指定希望显示日期/时间的格式.示例可以在相关的MSDN页面上找到.