Je jouais avec la méthode Datetime.ParseExact, et il veut un IFormatProvider ...
Cela fonctionne en entrant null, mais que fait-il exactement?
En plus de la réponse de Ian Boyd:
De plus, CultureInfo
implémente cette interface et peut être utilisé dans votre cas. Ainsi, vous pouvez analyser une chaîne de date française par exemple; vous pourriez utiliser
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
L’interface IFormatProvider
est normalement implémentée pour vous par une classe CultureInfo
, par exemple:
CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
L'interface est une passerelle permettant à une fonction d'obtenir un ensemble de données spécifiques à une culture à partir d'une culture. Les deux objets de culture couramment disponibles pour lesquels un IFormatProvider
peut être interrogé sont:
DateTimeFormatInfo
NumberFormatInfo
Cela fonctionnerait normalement si vous demandiez au IFormatProvider
de vous donner un objet DateTimeFormatInfo
:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Il existe également des connaissances internes selon lesquelles toute interface IFormatProvider
est probablement mise en œuvre par une classe qui descend de CultureInfo
ou de DateTimeFormatInfo
, de sorte que vous pouvez directement convertir l'interface:
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);
Tout ce dur travail a déjà été écrit pour vous:
Pour obtenir un DateTimeFormatInfo
à partir d'un IFormatProvider
:
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Pour obtenir un NumberFormatInfo
à partir d'un IFormatProvider
:
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
La valeur de IFormatProvider
est que vous créez vos propres objets de culture. Tant qu'ils implémentent IFormatProvider
et renvoient les objets qui leur sont demandés, vous pouvez contourner les cultures intégrées.
Vous pouvez également utiliser IFormatProvider
pour passer des objets de culture arbitraires - par le biais de IFormatProvider
. Par exemple. le nom de dieu dans différentes cultures
Cela permet à votre classe personnalisée LordsNameFormatInfo
de naviguer à l'intérieur d'un IFormatProvider
, et vous pouvez conserver l'idiome.
En réalité, vous n'aurez jamais besoin d'appeler vous-même la méthode GetFormat
de IFormatProvider
.
Chaque fois que vous avez besoin d'un IFormatProvider
, vous pouvez passer un objet CultureInfo
:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Note: Tout code est publié dans le domaine public. Aucune attribution requise.
Transmettre null en tant que IFormatProvider
n'est pas la bonne façon de procéder. Si l'utilisateur a un format de date/heure personnalisé sur son PC, vous rencontrerez des problèmes d'analyse et de conversion en chaîne. Je viens de corriger un bogue dans lequel quelqu'un avait passé la valeur null en tant que IFormatProvider lors de la conversion en chaîne.
Au lieu de cela, vous devriez utiliser CultureInfo.InvariantCulture
Faux:
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/en-us/library/system.iformatprovider.aspx
Voir les remarques et la section des exemples ici.
IFormatProvider fournit des informations sur la culture à la méthode en question. DateTimeFormatInfo implémente IFormatProvider et vous permet de spécifier le format d'affichage de votre date/heure. Des exemples figurent sur les pages MSDN correspondantes.
Vérifiez http://msdn.Microsoft.com/en-us/library/system.iformatprovider.aspx pour l'API.
Par MSDN
Le .NET Framework inclut les implémentations suivantes de trois prédéfinies IFormatProvider afin de fournir des informations spécifiques à la culture utilisées dans le formatage ou l'analyse de valeurs numériques et de date et heure:
NumberFormatInfo
fournit des informations permettant de formater des nombres, tels que les symboles de devise, de séparateur de milliers et de séparateur décimal, pour une culture donnée. Pour plus d'informations sur les chaînes de format prédéfinies reconnues par un objet NumberFormatInfo
et utilisées dans les opérations de formatage numériques, voir Chaînes de format numérique standard et Chaînes de format numérique personnalisées.DateTimeFormatInfo
fournit des informations utilisées pour formater les dates et les heures, telles que les symboles séparateurs de date et d'heure pour une culture particulière ou l'ordre et le format des composants année, mois et jour d'une date. Pour plus d'informations sur les chaînes de format prédéfinies reconnues par un objet DateTimeFormatInfo
et utilisées dans les opérations de formatage numériques, voir Chaînes de format standard à la date et à l'heure et Chaînes de format personnalisées à la date et à l'heure.CultureInfo
, qui représente une culture particulière. Sa méthode GetFormat
renvoie un objet NumberFormatInfo
ou DateTimeFormatInfo
propre à la culture, selon que l'objet CultureInfo
est utilisé dans une opération de formatage ou d'analyse comportant des nombres. ou 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 à la fois IFormatProvider et ICustomFormatter. Une instance de cette classe est ensuite transmise en tant que paramètre à une méthode qui effectue une opération de mise en forme personnalisée, telle que String.Format(IFormatProvider, String, Object[])
.
La classe DateTimeFormatInfo implémente cette interface. Elle vous permet donc de contrôler le formatage de vos chaînes DateTime.