为什么DateTime.ParseExact(String,String,IFormatProvider)需要IFormatProvider?

Yai*_*vet 54 c# datetime iformatprovider

如果我们使用该ParseExact方法使用指定的格式进行精确的日期时间解析,为什么我们需要提供IFormatProvider对象?它的背后有什么意义?

例如:

DateTime.ParseExact(dateString, format, provider);
Run Code Online (Sandbox Code Playgroud)

我们为什么需要provider这里?

Jon*_*eet 60

为什么我们需要提供IFormatProvider对象?它的背后有什么意义?

它允许特定于文化的选项.特别是:

  • 您使用的格式可以是标准日期/时间格式,这意味着不同文化中的不同模式
  • 您可以在模式中使用:/,分别表示时间分隔符或日期分隔符的特定于文化的字符
  • 在解析月份和日期名称时,这些明显取决于文化
  • 文化也会确定默认日历,这会影响结果

作为最后一点的一个例子,考虑在美国或沙特阿拉伯文化中解释的相同的字符串和格式:

using System;
using System.Globalization;

class Test
{
    static void Main()        
    {
        CultureInfo us = new CultureInfo("en-US");
        CultureInfo sa = new CultureInfo("ar-SA");
        string text = "1434-09-23T15:16";
        string format = "yyyy'-'MM'-'dd'T'HH':'mm";
        Console.WriteLine(DateTime.ParseExact(text, format, us));
        Console.WriteLine(DateTime.ParseExact(text, format, sa));
    }
} 
Run Code Online (Sandbox Code Playgroud)

在使用美国文化进行分析时,使用格里高利历 - 而在使用沙特阿拉伯文化进行分析时,使用Um Al Qura日历,其中1434是我们目前所处的年份(当我写这个答案时).

  • @JonSkeet所以基本上,如果你有一个自定义格式为"y2015m04d17"的字符串并使用解析格式"'y'yyyy'm'MM'd'dd",你可以告诉解析器留下'y',m'和'd'一个人,而不是将它们解释为年/月/日.否则解析器可能会感到困惑,对吧?:) (2认同)