Question

Je jouais avec la méthode Datetime.ParseExact, et il veut un IFormatProvider ...

Il fonctionne l'entrée nulle, mais qu'est-ce exactement il faire?

Était-ce utile?

La solution

En plus de la réponse de Ian Boyd:

Aussi implémente cette interface CultureInfo et peut être utilisé dans votre cas. Ainsi, vous pouvez analyser une chaîne de date française par exemple; vous pouvez utiliser

var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);

Autres conseils

L'interface est normalement mis en œuvre IFormatProvider pour vous par une classe de CultureInfo, par exemple:.

  • CultureInfo.CurrentCulture
  • CultureInfo.CurrentUICulture
  • CultureInfo.InvariantCulture
  • CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)

L'interface est une passerelle pour une fonction pour obtenir un ensemble de données spécifiques à la culture d'une culture. Les deux objets culture couramment disponibles que peut être un DateTimeFormatInfo interrogé pour sont:

  • NumberFormatInfo
  • LordsNameFormatInfo

La façon dont il est normalement vous demander de travailler le pour vous donner GetFormat un objet <=>:

DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
   DoStuffWithDatesOrTimes(format);

Il y a aussi des connaissances à l'intérieur que toute interface est <=> mise en œuvre probablement par une classe qui descend de <=> ou descend de <=>, de sorte que vous pourriez lancer l'interface directement:

CultureInfo info = provider as CultureInfo;
if (info != null)
   format = info.DateTimeInfo;
else
{
   DateTimeFormatInfo dtfi = provider as DateTimeFormatInfo;
   if (dtfi != null)
       format = dtfi;
   else
       format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
}

if (format != null)
   DoStuffWithDatesOrTimes(format);

Mais ne le faites pas

Tout ce travail a déjà été écrit pour vous:

Pour obtenir un <=> d'un <=> :

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

Pour obtenir un <=> d'un <=> :

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

La valeur de est que vous <=> créer vos propres objets de culture. Tant qu'ils mettent en œuvre <=>, et le retour des objets qu'ils demandaient, vous pouvez contourner le intégré dans les cultures.

Vous pouvez également utiliser un moyen <=> de passer des objets de la culture arbitraire - par la <=>. Par exemple. le nom de Dieu dans les différentes cultures

  • dieu
  • Dieu
  • Jehova
  • Yahwe
  • יהוה
  • אהיה אשר אהיה

Cela permet ainsi à l'intérieur d'un tour de classe <=> votre commande <=>, et vous pouvez préserver l'idiome.

En réalité, vous aurez jamais besoin d'appeler la méthode de vous-même <=> <=>.

Chaque fois que vous avez besoin d'un <=> vous pouvez passer un objet <=>:

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
  

Remarque : Tout code est libéré dans le domaine public. Aucune attribution requise.

Passage null comme n'est pas la IFormatProvider bonne façon de le faire. Si l'utilisateur a une date personnalisée / format de l'heure sur leur PC, vous aurez des problèmes dans l'analyse et la conversion en chaîne. Je viens Correction d'un bug quelqu'un avait passé null comme IFormatProvider lors de la conversion en chaîne.

Au lieu de cela, vous devez utiliser CultureInfo.InvariantCulture

Mauvais:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);

Correct:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);

Vous pouvez voir ici http://msdn.microsoft.com/ fr-fr / bibliothèque / system.iformatprovider.aspx

Voir la section des remarques et exemple là.

IFormatProvider fournit des informations de culture à la méthode en question. DateTimeFormatInfo implémente IFormatProvider et vous permet de spécifier le format vous voulez que votre date / heure à afficher dans. des exemples peuvent être trouvés dans les pages MSDN pertinents.

MSDN

Le .NET Framework comprend les éléments suivants trois implémentations prédéfinies IFormatProvider pour fournir des informations spécifiques à la culture qui est utilisée dans la mise en forme ou de l'analyse des valeurs numériques et la date et l'heure:

  1. La classe NumberFormatInfo, qui fournit des informations qui sont utilisées à des numéros de format, tels que la monnaie, séparateur de milliers, et les symboles de séparateur décimal pour une culture particulière. Pour plus d'informations sur les chaînes de format prédéfinies reconnues par un objet et utilisés dans DateTimeFormatInfo opérations de mise en forme numérique, consultez Chaînes de format numérique standard et chaînes de format numérique personnalisé.
  2. La CultureInfo classe, qui fournit des informations qui est utilisé pour les dates et heures format, telles que la date et les symboles de séparation temps pour une culture ou l'ordre et le format de l'année, le mois et les composants de jour d'une date. Pour plus d'informations sur les chaînes de format prédéfinies reconnues par un objet et utilisés dans GetFormat opérations de mise en forme numérique, voir la date et le format standard du temps et des chaînes Date personnalisée et chaînes de format de l'heure.
  3. La classe String.Format(IFormatProvider, String, Object[]), ce qui représente une culture particulière. Sa méthode retourne un <=> objet ou <=> spécifique à la culture <=>, selon que l'objet est utilisé dans <=> un formatage ou une opération qui implique l'analyse des chiffres ou des dates et heures.

Le .NET Framework prend également en charge la mise en forme personnalisée. Cela implique généralement la création d'une classe de formatage qui implémente les deux IFormatProvider et ICustomFormatter. On fait ensuite passer une instance de cette classe en tant que paramètre à un procédé qui effectue une opération de mise en forme personnalisée, comme <=>.

La classe DateTimeFormatInfo implémente cette interface, il vous permet de contrôler la mise en forme de vos chaînes de DateTime.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top