我正在使用Datetime.ParseExact方法,它想要一个IFormatProvider ......
输入null是有效的,但它到底是做什么的?
答案 0 :(得分:54)
除了Ian Boyd的回答:
同样CultureInfo
实现了此接口,可以在您的情况下使用。所以你可以解析一个法国日期字符串,例如;你可以用
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
答案 1 :(得分:40)
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"));
注意:任何代码都会发布到公共域中。无需归属。
答案 2 :(得分:16)
传递null为IFormatProvider
不是正确的方法。如果用户的PC上有自定义日期/时间格式,则在解析和转换为字符串时会遇到问题。我刚刚修正了一个错误,当有人在转换为字符串时将其作为IFormatProvider传递null。
相反,您应该使用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);
答案 3 :(得分:5)
您可以在此处查看http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
请参阅那里的备注和示例部分。
答案 4 :(得分:5)
IFormatProvider为相关方法提供文化信息。 DateTimeFormatInfo实现了IFormatProvider,并允许您指定希望显示日期/时间的格式。示例可以在相关的MSDN页面上找到。
答案 5 :(得分:2)
答案 6 :(得分:2)
按MSDN
.NET Framework包含以下三个预定义的IFormatProvider实现,以提供用于格式化或解析数字和日期和时间值的特定于区域性的信息:
NumberFormatInfo
类,它提供用于格式化数字的信息,例如特定区域性的货币,千位分隔符和小数分隔符号。有关NumberFormatInfo
对象识别并在数字格式设置操作中使用的预定义格式字符串的信息,请参阅标准数字格式字符串和自定义数字格式字符串。DateTimeFormatInfo
类,提供用于格式化日期和时间的信息,例如特定文化的日期和时间分隔符号,或者日期和月份的顺序和格式和日组件。有关DateTimeFormatInfo
对象识别并在数字格式设置操作中使用的预定义格式字符串的信息,请参阅标准日期和时间格式字符串以及自定义日期和时间格式字符串。CultureInfo
类。其GetFormat
方法返回特定于区域性的NumberFormatInfo
或DateTimeFormatInfo
对象,具体取决于CultureInfo
对象是否用于涉及数字或日期和时间的格式化或解析操作 .NET Framework还支持自定义格式。这通常涉及创建实现IFormatProvider和ICustomFormatter的格式化类。然后将此类的实例作为参数传递给执行自定义格式化操作的方法,例如String.Format(IFormatProvider, String, Object[])
。
答案 7 :(得分:1)
DateTimeFormatInfo类实现了此接口,因此它允许您控制DateTime字符串的格式。
答案 8 :(得分:0)
该问题询问了 IFormatProvider 和 DateTime,但您也可以在 .NET 的其他上下文中使用 IFormatProvider,例如 string.Format。
然后您传入 IFormatProvider 实例,您可以通过实现 IFormatProvider 指定如何为对象格式化字符串。因此,在 .NET 中,IFormatProvider 和相关的 ICustomFormatter 接口的用法比仅用于日期更广泛。
例如考虑这个实现:
using System;
namespace ConsoleApp
{
class EmployeeProductivityFormatProvider : IFormatProvider, ICustomFormatter
{
public string Format(string format, object arg, IFormatProvider formatProvider)
{
int rating = (int)arg;
if (rating == 0)
{
return $"{rating} (new employee)";
}
if (rating > 0)
{
return $"{rating} (good employee)";
}
return $"{rating} (bad employee)";
}
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
{
return this;
}
return null;
}
}
}
现在我们可以通过指定一个 int 值来获取员工的字符串表示:
string prod = string.Format(new EmployeeProductivityFormatProvider(),
"Productivity rating: {0}",
employee.ProductivityRating);
说到 DateTime,有很多已经创建的 IFormatProvider 实现可供选择。这是将对象表示为字符串并在 .NET 中指定其格式的一种非常灵活的方式,也是一个非常通用的概念。