Ich spielte mit der Datetime.ParseExact-Methode, und es will ein IFormatProvider ...Was macht IFormatProvider?
Es funktioniert Null eingeben, aber was genau tut es?
Ich spielte mit der Datetime.ParseExact-Methode, und es will ein IFormatProvider ...Was macht IFormatProvider?
Es funktioniert Null eingeben, aber was genau tut es?
Auch CultureInfo implementiert diese Schnittstelle und kann in Ihrem Fall verwendet werden. So könnten Sie beispielsweise eine französische Datumszeichenfolge parsen; Sie könnten
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.Parse(yourDateInputString, yourFormatString, ci);
Es scheint keine Überlastung mehr zu geben, die Ihrem Beispiel in .NET Framework 4.6 entspricht. Sie müssen 'DateTime.ParseExact (string, string, IFormatProvider)' stattdessen, glaube ich - als solche verwenden: 'DateTime.ParseExact (" 20160409 111559 "," yyyyMMdd HHmmss ", CultureInfo.CurrentCulture)' –
Ich werde die Antwort aktualisieren :) –
können Sie hier sehen http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
Siehe dort die Bemerkungen und Beispielabschnitt.
Ironischerweise verwendet der Beispielcode für "IFormatProvider" nicht "IFormatProvider". –
Überprüfen Sie http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx für die API.
Die Klasse DateTimeFormatInfo implementiert diese Schnittstelle, sodass Sie die Formatierung Ihrer DateTime-Zeichenfolgen steuern können.
IFormatProvider liefert Kulturinformationen zu der betreffenden Methode. DateTimeFormatInfo implementiert IFormatProvider und ermöglicht Ihnen, das Format anzugeben, in dem Datum und Uhrzeit angezeigt werden sollen. Beispiele finden Sie auf den entsprechenden MSDN-Seiten.
Passing null verwenden, da die IFormatProvider
nicht der richtige Weg, dies zu tun. Wenn der Benutzer ein benutzerdefiniertes Datums-/Uhrzeitformat auf seinem PC hat, werden Probleme beim Parsen und Konvertieren in eine Zeichenfolge auftreten. Ich habe gerade einen Fehler behoben, bei dem als IFormatProvider bei der Konvertierung in eine Zeichenfolge null übergeben wurde.
Stattdessen sollten Sie CultureInfo.InvariantCulture
Falsche Verwendung werden:
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);
Gibt es einen Grund, warum wir 'CultureInfo.InvariantCulture' anstelle von' CultureInfo.CurrentCulture' verwenden sollten? –
InvariantCulture ist eine spezielle Kultur, die garantiert immer auf jedem Rechner existiert und immer zu den gleichen Werten konvertiert und analysiert wird. CurrentCulture ist die Kultur des aktuellen Threads. Dies kann variieren und wenn Sie nicht die gleiche Kultur verwenden, um in String und Pars zu konvertieren, erhalten Sie Formatfehler ... – Tim
@StephenBooher Übergabe in 'null' wird standardmäßig auf' CultureInfo.CurrentCulture'. Sehen Sie sich den Aufruf in der [Referenzquelle] an (http://referencesource.microsoft.com/mscorlib/a.html#bfc8add12515d311). Wenn Sie die Kette von Aufrufen mitverfolgen, wird die Null schließlich durch [DateTimeFormatInfo.CurrentInfo] ersetzt ] (http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.currentinfo (v = vs.110) .aspx), was dem entspricht, was 'CultureInfo.CurrentCulture' ausgibt. –
Die IFormatProvider
Schnittstelle für Sie wird in der Regel durch eine CultureInfo
Klasse implementiert, zum Beispiel:
CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
Die Schnittstelle ist ein Gateway für eine Funktion einen Satz von kulturspezifischen Daten aus einer Kultur zu erhalten.Die zwei allgemein verfügbare Kulturobjekte, die eine IFormatProvider
können abgefragt werden:
DateTimeFormatInfo
NumberFormatInfo
So wie es normalerweise Sie die IFormatProvider
fragen würde, arbeiten Sie ein DateTimeFormatInfo
Objekt zu geben:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Es gibt auch Insiderwissen, dass alle IFormatProvider
Schnittstelle wird wahrscheinlich von einer Klasse implementiert werden, die von CultureInfo
absteigt, oder stammt von DateTimeFormatInfo
, so könnten Sie die Schnittstelle direkt Stimmen:
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);
dass alle harte Arbeit hat bereits wurde für Sie geschrieben:
Um einen DateTimeFormatInfo
von einem IFormatProvider
zu erhalten:
Um eine NumberFormatInfo
von einem IFormatProvider
:
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
Der Wert IFormatProvider
ist, dass Sie Ihre eigene Kultur Objekte erstellen. Solange sie IFormatProvider
implementieren und Objekte zurückgeben, nach denen sie gefragt werden, können Sie die integrierten Kulturen umgehen.
Sie können IFormatProvider
auch verwenden, um beliebige Kulturobjekte zu übergeben - über die IFormatProvider
. Z.B. der Name Gottes in verschiedenen Kulturen
Diese Fahrt Ihre benutzerdefinierten LordsNameFormatInfo
Klasse können entlang in einem IFormatProvider
, und Sie können t bewahren er Idiom.
In der Realität werden Sie nie GetFormat
Methode von IFormatProvider
selbst anrufen müssen.
Wann immer Sie brauchen ein IFormatProvider
Sie ein CultureInfo
Objekt passieren kann:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Hinweis: Jeder Code wird in die Public Domain freigegeben. Keine Zuordnung erforderlich.
von MSDN
Das .NET Framework enthält die folgenden drei vordefinierte IFormatProvider Implementierungen kulturspezifische Informationen, die bei der Formatierung oder Parsen von numerischen und Datums- und Zeitwerte verwendet:
NumberFormatInfo
enthält Informationen zum Formatieren von Zahlen, z. B. Währungssymbol, Tausendertrennzeichen und Dezimaltrennzeichen für eine bestimmte Kultur. Informationen zu den vordefinierten Formatzeichenfolgen, die von einem NumberFormatInfo
-Objekt erkannt und in numerischen Formatierungsoperationen verwendet werden, finden Sie unter Standardmäßige Zahlenformatzeichenfolgen und Benutzerdefinierte Zahlenformatzeichenfolgen.DateTimeFormatInfo
, die Informationen zum Formatieren von Datum und Uhrzeit bereitstellt, z. B. die Datums- und Uhrzeittrennungssymbole für eine bestimmte Kultur oder die Reihenfolge und das Format der Datums-, Monats- und Tageskomponenten. Informationen zu den vordefinierten Formatzeichenfolgen, die von einem DateTimeFormatInfo
-Objekt erkannt und in numerischen Formatierungsoperationen verwendet werden, finden Sie unter Standardformatzeichenfolgen für Datum und Uhrzeit und benutzerdefinierte Formatzeichenfolgen für Datum und Uhrzeit.CultureInfo
Klasse, die eine bestimmte Kultur darstellt. Seine Methode GetFormat
gibt ein kulturspezifisches Objekt NumberFormatInfo
oder DateTimeFormatInfo
zurück, abhängig davon, ob das Objekt CultureInfo
in einer Formatierungs- oder Parsingoperation verwendet wird, die Zahlen oder Datums- und Uhrzeitangaben enthält.Das .NET Framework unterstützt auch benutzerdefinierte Formatierung. 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. B. String.Format(IFormatProvider, String, Object[])
.
mögliche Duplikate von [Warum DateTime.ParseExact (String, String, IFormatProvider) brauchen den IFormatProvider?] (Http://stackoverflow.com/questions/18961520/why-datetime-parseexactstring-string-iformatprovider-need-the- iformatprovide). Ich stimme mit einem neueren überein, weil es besser formuliert ist und besser beantwortet werden kann. – nawfal