Answers:
除了伊恩·博伊德(Ian Boyd)的答案:
还CultureInfo
实现此接口,可以在您的情况下使用。例如,您可以解析一个法语日期字符串;你可以用
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
DateTime.ParseExact(string, string, IFormatProvider)
我相信您必须改为使用-这样: DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
DateTime dt = DateTime.Parse(yourDateInputString, ci);
请修改您的答案。
该IFormatProvider
接口通常由一个CultureInfo
类为您实现,例如:
CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.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
就可以,并且可以保留该惯用法。
实际上,您永远不需要调用以下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);
CultureInfo.InvariantCulture
代替使用CultureInfo.CurrentCulture
吗?
null
默认为CultureInfo.CurrentCulture
。请参阅参考源中的调用,如果您遵循调用链,那么最终将替换为null,DateTimeFormatInfo.CurrentInfo
它等于CultureInfo.CurrentCulture
输出的内容。
IFormatProvider为相关方法提供区域性信息。DateTimeFormatInfo实现IFormatProvider,并允许您指定希望日期/时间显示的格式。可以在相关的MSDN页面上找到示例。
您可以在这里看到http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
请参阅此处的备注和示例部分。
IFormatProvider
没有使用IFormatProvider
。
通过 MSDN
.NET Framework包括以下三个预定义的IFormatProvider实现,以提供特定于区域性的信息,这些信息用于格式化或解析数字以及日期和时间值:
NumberFormatInfo
类,它提供一个用于格式化数字,如货币,千位分隔符和小数分隔符号用于特定文化的信息。有关NumberFormatInfo
对象识别并用于数字格式操作的预定义格式字符串的信息,请参阅“标准数字格式字符串”和“自定义数字格式字符串”。DateTimeFormatInfo
类,它提供了用于日期和时间格式,如特定的文化或日期的年,月,日组成部分的顺序和格式的日期和时间分隔符符号的信息。有关由a识别的预定义格式字符串的信息DateTimeFormatInfo
对象并用于数字格式操作,请参阅标准日期和时间格式字符串和自定义日期和时间格式字符串。CultureInfo
类,它代表一个特定的文化。它的GetFormat
方法返回特定于区域性的NumberFormatInfo
或DateTimeFormatInfo
对象,具体取决于CultureInfo
对象是在涉及数字还是日期和时间的格式化或解析操作中使用的。.NET Framework也支持自定义格式。这通常涉及创建同时实现IFormatProvider和ICustomFormatter的格式化类。然后,将该类的实例作为参数传递给执行自定义格式操作的方法,例如String.Format(IFormatProvider, String, Object[])
。
的的DateTimeFormatInfo类实现这个接口,所以它可以让您控制您的日期时间字符串的格式。