1

让我们考虑DateTimeOffset.ParseExact

public static DateTime ParseExact (
    string s, 
    string format, 
    IFormatProvider? provider, 
    System.Globalization.DateTimeStyles style
);

预期的格式已经通过format参数描述了,那么参数的目的是provider什么?谁能举例说明不同的provider值如何导致不同的结果?

4

4 回答 4

3

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

例子:

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 => 不同的结果。

于 2021-02-25T14:10:51.940 回答
3

例如CultureInfo实现IFormatProvider. 因此,除了您提供的格式字符串之外,您还可以传递具有自己的格式规则的文化。

另请注意,格式字符串可以包含说明符,这些说明符在不同的文化/格式提供者中表现不同,例如“/”自定义格式说明符

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); 

正如磁控管所评论的,这同样适用于“:”自定义时间格式说明符

于 2021-02-25T14:19:45.133 回答
1

不同的文化会使用不同的值来表示月份名称和星期几。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-FR看起来像这样:

在此处输入图像描述

于 2021-02-25T14:11:37.503 回答
1

文档对此非常清楚:

中使用的特定日期和时间符号和字符串inputformatProvider参数定义...

于 2021-02-25T14:12:08.313 回答