2009-02-03 7 views
65

Ich spielte mit der Datetime.ParseExact-Methode, und es will ein IFormatProvider ...Was macht IFormatProvider?

Es funktioniert Null eingeben, aber was genau tut es?

+3

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

Antwort

41

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); 
+2

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)' –

+0

Ich werde die Antwort aktualisieren :) –

1

Die Klasse DateTimeFormatInfo implementiert diese Schnittstelle, sodass Sie die Formatierung Ihrer DateTime-Zeichenfolgen steuern können.

5

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.

14

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); 
+2

Gibt es einen Grund, warum wir 'CultureInfo.InvariantCulture' anstelle von' CultureInfo.CurrentCulture' verwenden sollten? –

+4

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

+5

@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. –

29

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); 

Aber tun das nicht

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

  • Gott
  • Gott
  • Jehova
  • Jahwes
  • יהוה
  • אהיה אשר אהיה

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.

2

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:

  1. Die Klasse 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.
  2. Die Klasse 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.
  3. Die 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[]).