Почему DateTime.ParseExact(String, String, IFormatProvider) нужен IFormatProvider?

Если мы используем метод ParseExact для синтаксического анализа даты и времени точный с использованием указанного формата, почему нам нужно предоставить объект IFormatProvider? в чем смысл этого?

Например:

DateTime.ParseExact(dateString, format, provider);

Зачем нам нужен provider здесь?

Ответ 1

почему нам нужно предоставить объект 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));
    }
} 

При анализе культуры США используется григорианский календарь, тогда как при разборе с саудовской культурой используется календарь Um Al Qura, где 1434 - это год, в котором мы сейчас находимся (как я пишу этот ответ).