web-dev-qa-db-fra.com

Pourquoi DateTime.ParseExact (String, String, IFormatProvider) a besoin de IFormatProvider?

Si nous utilisons la méthode ParseExact pour exact l'analyse de la date et de l'heure à l'aide d'un format spécifié, pourquoi Avons-nous besoin de fournir un objet IFormatProvider? quel est le point derrière cela?

Par exemple:

DateTime.ParseExact(dateString, format, provider);

Pourquoi avons-nous besoin du provider ici?

54
Yair Nevet

pourquoi devons-nous fournir un objet IFormatProvider? quel est le point derrière cela?

Il permet des options spécifiques à la culture. En particulier:

  • Le format que vous utilisez peut être un format de date/heure standard, ce qui signifie différents modèles dans différentes cultures.
  • Vous pouvez utiliser : ou / dans votre modèle, ce qui signifie des caractères propres à la culture pour le séparateur d'heure ou de date
  • Lors de l'analyse des noms de mois et de jours, ceux-ci dépendent clairement de la culture
  • La culture détermine également le calendrier par défaut, ce qui affectera le résultat.

À titre d'exemple du dernier point, considérons la même chaîne exacte et le même format, interprétés dans la culture des États-Unis ou de l'Arabie saoudite:

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

Lors de l'analyse syntaxique avec la culture américaine, le calendrier grégorien est utilisé - alors que lorsqu'il est analysé avec la culture saoudienne, le calendrier Um Al Qura est utilisé, où 1434 est l'année dans laquelle nous sommes actuellement (au moment où j'écris cette réponse).

60
Jon Skeet