C# 什么';DateTime和DateTimeOffset的ParseExact()中的格式提供程序的用途是什么? 让我们考虑< /P>

C# 什么';DateTime和DateTimeOffset的ParseExact()中的格式提供程序的用途是什么? 让我们考虑< /P>,c#,datetime,datetimeoffset,iformatprovider,C#,Datetime,Datetimeoffset,Iformatprovider,预期的格式已经通过format参数进行了描述,那么provider参数的用途是什么?任何人都可以举例说明不同的提供程序值如何导致不同的结果?自定义日期时间格式字符串的各种元素的含义取决于格式提供程序 例如: var aString = "12 avr. 2021"; var gbCulture = new CultureInfo("en-GB"); var frCulture = new CultureInfo("fr-FR"); v

预期的格式已经通过
format
参数进行了描述,那么
provider
参数的用途是什么?任何人都可以举例说明不同的
提供程序
值如何导致不同的结果?

自定义日期时间格式字符串的各种元素的含义取决于格式提供程序

例如:

var aString = "12 avr. 2021";
var gbCulture = new CultureInfo("en-GB");
var frCulture = new CultureInfo("fr-FR");

var canParseGb = 
    DateTime.TryParseExact(aString, "dd MMM yyyy", gbCulture, DateTimeStyles.None, out var gbDateTime);
var canParseFr = 
    DateTime.TryParseExact(aString, "dd MMM yyyy", frCulture, DateTimeStyles.None, out var frDateTime);

相同的输入字符串
s
,相同的格式字符串
format
,不同的
provider
s=>不同的结果。

不同的区域性将使用不同的值,例如月份名称和一周中的天数
Jul
对你来说可能是七月,但在法国不是。例如:

var frenchDate = DateTimeOffset.ParseExact("1 févr. 2020", "d MMM yyyy", 
    CultureInfo.GetCultureInfo("fr-FR"));

var englishDate = DateTimeOffset.ParseExact("1 Feb 2020", "d MMM yyyy", 
    CultureInfo.GetCultureInfo("en-GB"));
所有这些详细信息都可以在
CultureInfo
对象中看到,例如
fr
如下所示:


文档中对这一点非常清楚:

input
中使用的特定日期和时间符号和字符串由
formatProvider
参数定义


例如
CultureInfo
实现
IFormatProvider
。因此,您可以传递一个区域性,该区域性除了提供的格式字符串外,还具有自己的格式规则

还请注意,格式字符串可以包含在不同的区域性/格式提供程序中表现不同的说明符,如:


正如Magnetron评论的那样,这同样适用于

,我希望它与某些日期格式的文本元素有关。例如,“2020年6月12日”在英语中可能意味着2020-06-12,但在另一种语言中则完全不同。不同的文化会对诸如月份名称之类的东西使用不同的值七月对你来说可能是七月,但在法国不是。还有@Magnetron:谢谢,补充道
var frenchDate = DateTimeOffset.ParseExact("1 févr. 2020", "d MMM yyyy", 
    CultureInfo.GetCultureInfo("fr-FR"));

var englishDate = DateTimeOffset.ParseExact("1 Feb 2020", "d MMM yyyy", 
    CultureInfo.GetCultureInfo("en-GB"));
CultureInfo deCulture = new CultureInfo("de-DE"); // german
CultureInfo frCulture = new CultureInfo("fr-FR"); // french
// works because / is replaced with the passed culture's date-separator which is . in germany
DateTime dateDe = DateTime.ParseExact("25.02.2021", "dd/MM/yyyy", deCulture, DateTimeStyles.None); 
// works not since french use / as date-separator
DateTime dateFr = DateTime.ParseExact("25.02.2021", "dd/MM/yyyy", frCulture, DateTimeStyles.None);