Je jouais avec la méthode Datetime.ParseExact, et il veut un IFormatProvider ...
Cela fonctionne en entrant null, mais que fait-il exactement?
Je jouais avec la méthode Datetime.ParseExact, et il veut un IFormatProvider ...
Cela fonctionne en entrant null, mais que fait-il exactement?
Réponses:
En plus de la réponse d'Ian Boyd:
Implémente également CultureInfo
cette interface et peut être utilisée dans votre cas. Ainsi, vous pouvez analyser une chaîne de date française par exemple; tu pourrais utiliser
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
DateTime.ParseExact(string, string, IFormatProvider)
place, je crois - en tant que tel: DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
DateTime dt = DateTime.Parse(yourDateInputString, ci);
Veuillez réviser votre réponse.
L' IFormatProvider
interface est normalement implémentée pour vous par une CultureInfo
classe, 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:
La façon dont cela fonctionnerait normalement est de demander au IFormatProvider
de vous donner un DateTimeFormatInfo
objet:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Il y a aussi une connaissance interne que toute IFormatProvider
interface est probablement implémentée par une classe qui descend CultureInfo
ou descend de DateTimeFormatInfo
, vous pouvez donc convertir 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);
Tout ce travail acharné a déjà été écrit pour vous:
Pour obtenir un DateTimeFormatInfo
d'unIFormatProvider
:
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Pour obtenir un NumberFormatInfo
d'unIFormatProvider
:
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 retournent les objets qui leur sont demandés, vous pouvez contourner les cultures intégrées.
Vous pouvez également l'utiliser IFormatProvider
pour transmettre des objets de culture arbitraires - via le IFormatProvider
. Par exemple, le nom de Dieu dans différentes cultures
Cela permet à votre LordsNameFormatInfo
classe personnalisée de circuler à l'intérieur d'un IFormatProvider
, et vous pouvez préserver l'idiome.
En réalité, vous n'aurez jamais besoin d'appeler la GetFormat
méthode de IFormatProvider
vous - même.
Chaque fois que vous en avez besoin, IFormatProvider
vous pouvez passer un CultureInfo
objet:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Remarque : tout code est publié dans le domaine public. Aucune attribution requise.
Passer null comme le 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 où quelqu'un avait passé null comme 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);
CultureInfo.InvariantCulture
place CultureInfo.CurrentCulture
?
null
sera par défaut CultureInfo.CurrentCulture
. Voir l'appel dans la source de référence , si vous suivez la chaîne d'appels, le null est finalement remplacé par DateTimeFormatInfo.CurrentInfo
ce qui équivaut à quelles CultureInfo.CurrentCulture
sorties.
IFormatProvider fournit des informations de culture à la méthode en question. DateTimeFormatInfo implémente IFormatProvider et vous permet de spécifier le format dans lequel vous voulez que votre date / heure soit affichée. Des exemples peuvent être trouvés sur les pages MSDN appropriées.
Vous pouvez voir ici http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
Voir les remarques et la section exemple ici.
IFormatProvider
ne pas utiliser IFormatProvider
.
Consultez http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx pour l'API.
Par MSDN
Le .NET Framework comprend les trois implémentations IFormatProvider prédéfinies suivantes pour fournir des informations spécifiques à la culture qui sont utilisées dans le formatage ou l'analyse des valeurs numériques et de date et d'heure:
NumberFormatInfo
classe, qui fournit des informations utilisées pour mettre en forme les nombres, telles que la devise, le 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 NumberFormatInfo
objet et utilisées dans les opérations de formatage numérique, consultez Chaînes de format numérique standard et Chaînes de format numérique personnalisées.DateTimeFormatInfo
classe, qui fournit des informations utilisées pour mettre en forme les dates et les heures, telles que les symboles de séparation 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 DateTimeFormatInfo
objet et utilisées dans les opérations de formatage numérique, consultez Chaînes de format de date et d'heure standard et Chaînes de format de date et d'heure personnalisées.CultureInfo
classe, qui représente une culture particulière. Sa GetFormat
méthode renvoie un objet NumberFormatInfo
ou un DateTimeFormatInfo
objet propre à la culture , selon que l' CultureInfo
objet est utilisé dans une opération de mise en forme ou d'analyse qui implique des nombres ou des dates et des 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 mise en forme 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 la mise en forme de vos chaînes DateTime.