Ich habe mit der Datetime.ParseExact-Methode herumgespielt und sie möchte einen IFormatProvider ...
Es funktioniert mit der Eingabe von Null, aber was genau macht es?
Ich habe mit der Datetime.ParseExact-Methode herumgespielt und sie möchte einen IFormatProvider ...
Es funktioniert mit der Eingabe von Null, aber was genau macht es?
Antworten:
Zusätzlich zu Ian Boyds Antwort:
Auch CultureInfo
implementiert diese Schnittstelle und kann in Ihrem Fall verwendet werden. So können Sie beispielsweise eine französische Datumszeichenfolge analysieren. Du könntest benutzen
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
DateTime.ParseExact(string, string, IFormatProvider)
stattdessen verwenden, ich glaube - als solches: DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
DateTime dt = DateTime.Parse(yourDateInputString, ci);
Bitte überarbeiten Sie Ihre Antwort.
Die IFormatProvider
Schnittstelle wird normalerweise von einer CultureInfo
Klasse für Sie implementiert , z.
CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
Die Schnittstelle ist ein Gateway für eine Funktion zum Abrufen eines Satzes kulturspezifischer Daten aus einer Kultur. Die zwei allgemein verfügbaren Kulturobjekte, IFormatProvider
nach denen abgefragt werden kann, sind:
Normalerweise funktioniert es so, dass Sie den bitten IFormatProvider
, Ihnen ein DateTimeFormatInfo
Objekt zu geben :
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Es gibt auch Insiderwissen, dass jede IFormatProvider
Schnittstelle wahrscheinlich von einer Klasse implementiert wird, die von CultureInfo
oder absteigt DateTimeFormatInfo
, sodass Sie die Schnittstelle direkt umwandeln können:
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);
All diese harte Arbeit wurde bereits für Sie geschrieben:
So erhalten Sie eine DateTimeFormatInfo
vonIFormatProvider
:
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
So erhalten Sie eine NumberFormatInfo
vonIFormatProvider
:
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
Der Wert von IFormatProvider
ist, dass Sie Ihre eigenen Kulturobjekte erstellen. Solange sie IFormatProvider
Objekte implementieren und zurückgeben, nach denen sie gefragt werden, können Sie die integrierten Kulturen umgehen.
Sie können auch IFormatProvider
beliebige Kulturobjekte weiterleiten - durch die IFormatProvider
. ZB der Name Gottes in verschiedenen Kulturen
Auf diese Weise kann Ihre benutzerdefinierte LordsNameFormatInfo
Klasse in einem mitfahren IFormatProvider
, und Sie können die Redewendung beibehalten.
In Wirklichkeit müssen Sie niemals die GetFormat
Methode Ihrer IFormatProvider
selbst aufrufen .
Wann immer Sie eine benötigen IFormatProvider
, können Sie ein CultureInfo
Objekt übergeben:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Hinweis : Jeder Code wird öffentlich zugänglich gemacht. Keine Zuordnung erforderlich.
Das Übergeben von null als IFormatProvider
ist nicht der richtige Weg, dies zu tun. Wenn der Benutzer ein benutzerdefiniertes Datums- / Uhrzeitformat auf seinem PC hat, treten Probleme beim Parsen und Konvertieren in Zeichenfolgen auf. Ich habe gerade einen Fehler behoben, bei dem jemand beim Konvertieren in einen String null als IFormatProvider übergeben hatte.
Stattdessen sollten Sie verwenden CultureInfo.InvariantCulture
Falsch:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);
Richtig:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
CultureInfo.InvariantCulture
anstelle von verwenden sollten CultureInfo.CurrentCulture
?
null
wird standardmäßig übergeben CultureInfo.CurrentCulture
. Siehe den Aufruf in der Referenzquelle . Wenn Sie der Aufrufkette folgen, wird die Null schließlich durch DateTimeFormatInfo.CurrentInfo
die ersetzt, die den CultureInfo.CurrentCulture
Ausgaben entspricht.
IFormatProvider bietet Kulturinformationen zu der betreffenden Methode. DateTimeFormatInfo implementiert IFormatProvider und ermöglicht es Ihnen, das Format anzugeben, in dem Datum und Uhrzeit angezeigt werden sollen. Beispiele finden Sie auf den entsprechenden MSDN-Seiten.
Sie können hier http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx sehen
Siehe dort die Anmerkungen und das Beispiel.
IFormatProvider
nicht verwendet IFormatProvider
.
Überprüfen Sie http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx auf die API.
Von MSDN
Das .NET Framework enthält die folgenden drei vordefinierten IFormatProvider-Implementierungen, um kulturspezifische Informationen bereitzustellen, die beim Formatieren oder Parsen von numerischen Werten sowie Datums- und Zeitwerten verwendet werden:
NumberFormatInfo
Klasse, die Informationen bereitstellt, die zum Formatieren von Zahlen verwendet werden, z. B. die Symbole für Währung, Tausendertrennzeichen und Dezimaltrennzeichen für eine bestimmte Kultur. Informationen zu den vordefinierten Formatzeichenfolgen, die von einem NumberFormatInfo
Objekt erkannt und in numerischen Formatierungsvorgängen verwendet werden, finden Sie unter Standardzeichenfolgen für numerische Formate und Zeichenfolgen für benutzerdefinierte numerische Formate .DateTimeFormatInfo
Klasse, die Informationen bereitstellt, die zum Formatieren von Datum und Uhrzeit verwendet werden, z. B. die Datums- und Zeittrennzeichen für eine bestimmte Kultur oder die Reihenfolge und das Format der Jahres-, Monats- und Tageskomponenten eines Datums. Informationen zu den vordefinierten Formatzeichenfolgen, die von einem DateTimeFormatInfo
Objekt erkannt und in numerischen Formatierungsvorgängen verwendet werden, finden Sie unter Standard-Formatzeichenfolgen für Datum und Uhrzeit sowie Benutzerdefinierte Zeichenfolgen für Datums- und Zeitformat.CultureInfo
Klasse, die eine bestimmte Kultur repräsentiert. Seine GetFormat
Methode gibt eine kulturspezifische NumberFormatInfo
oder DateTimeFormatInfo
Objekt, je nachdem , ob das CultureInfo
Objekt in einer Formatierung oder Parsen Operation verwendet wird , die Zahlen oder Datumsangaben und Zeiten beinhaltet.Das .NET Framework unterstützt auch benutzerdefinierte Formatierungen. Dies beinhaltet normalerweise die Erstellung einer Formatierungsklasse, die sowohl IFormatProvider als auch ICustomFormatter implementiert. Eine Instanz dieser Klasse wird dann als Parameter an eine Methode übergeben, die eine benutzerdefinierte Formatierungsoperation ausführt, z String.Format(IFormatProvider, String, Object[])
.
Die DateTimeFormatInfo- Klasse implementiert diese Schnittstelle, sodass Sie die Formatierung Ihrer DateTime-Zeichenfolgen steuern können.