Bawiłem się metodą Datetime.ParseExact, a ona potrzebuje IFormatProvider ...
Działa, wprowadzając wartość null, ale co dokładnie robi?
c#
asp.net
iformatprovider
Moulde
źródło
źródło
Odpowiedzi:
W uzupełnieniu do odpowiedzi Iana Boyda:
CultureInfo
Implementuje również ten interfejs i może być używany w twoim przypadku. Na przykład można przeanalizować francuski łańcuch daty; mógłbyś użyćvar ci = new CultureInfo("fr-FR"); DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
źródło
DateTime.ParseExact(string, string, IFormatProvider)
Uważam, że zamiast tego należy użyć :DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
DateTime dt = DateTime.Parse(yourDateInputString, ci);
Popraw odpowiedź.IFormatProvider
Interfejs jest zazwyczaj realizowane za ciebie przezCultureInfo
klasy, np:CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
Interfejs jest bramą dla funkcji, która pobiera zestaw danych specyficznych dla kultury z kultury. Dwa powszechnie dostępne obiekty kultury, o które
IFormatProvider
można zapytać, to:DateTimeFormatInfo
NumberFormatInfo
Sposób, w jaki normalnie by działał, polega na tym, że prosisz
IFormatProvider
oDateTimeFormatInfo
przedmiot:DateTimeFormatInfo format; format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo)); if (format != null) DoStuffWithDatesOrTimes(format);
Istnieje również wewnętrzna wiedza, że każdy
IFormatProvider
interfejs jest prawdopodobnie implementowany przez klasę, która pochodziCultureInfo
lub pochodzi zDateTimeFormatInfo
, więc możesz rzutować interfejs bezpośrednio: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);
Ale nie rób tego
Cała ta ciężka praca została już dla Ciebie napisana:
Aby otrzymać
DateTimeFormatInfo
odIFormatProvider
:Aby otrzymać
NumberFormatInfo
odIFormatProvider
:Wartość
IFormatProvider
polega na tym, że tworzysz własne obiekty kultury. Dopóki implementująIFormatProvider
i zwracają obiekty, o które są proszone, można ominąć kultury wbudowane.Możesz również użyć
IFormatProvider
do przekazywania dowolnych obiektów kultury - przezIFormatProvider
. Np. Imię boga w różnych kulturachDzięki temu Twoja niestandardowa
LordsNameFormatInfo
klasa jedzie w środkuIFormatProvider
i możesz zachować idiom.W rzeczywistości nigdy nie będziesz musiał nazywać własnej
GetFormat
metodyIFormatProvider
.Zawsze, gdy potrzebujesz
IFormatProvider
, możesz przekazaćCultureInfo
obiekt:DateTime.Now.ToString(CultureInfo.CurrentCulture); endTime.ToString(CultureInfo.InvariantCulture); transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
źródło
Podanie wartości null, ponieważ
IFormatProvider
nie jest właściwym sposobem, aby to zrobić. Jeśli użytkownik ma niestandardowy format daty / czasu na swoim komputerze, będziesz mieć problemy z analizowaniem i konwersją na ciąg. Właśnie naprawiłem błąd, w którym ktoś przekazał wartość null jako IFormatProvider podczas konwersji na ciąg.Zamiast tego powinieneś używać
CultureInfo.InvariantCulture
Źle:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);
Poprawny:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
źródło
CultureInfo.InvariantCulture
zamiastCultureInfo.CurrentCulture
?null
będzie domyślnieCultureInfo.CurrentCulture
. Zobacz wywołanie w źródle odniesienia , jeśli podążasz za łańcuchem wywołań, wartość null ostatecznie zostanie zastąpiona przez,DateTimeFormatInfo.CurrentInfo
co jest równoważne z danymiCultureInfo.CurrentCulture
wyjściowymi.IFormatProvider udostępnia informacje o kulturze do danej metody. DateTimeFormatInfo implementuje IFormatProvider i umożliwia określenie formatu, w jakim ma być wyświetlana data / godzina. Przykłady można znaleźć na odpowiednich stronach MSDN.
źródło
Możesz zobaczyć tutaj http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
Zobacz tam uwagi i przykłady.
źródło
IFormatProvider
nie używaIFormatProvider
.Sprawdź http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx dla API.
źródło
Przez MSDN
NET Framework zawiera następujące trzy predefiniowane implementacje IFormatProvider, które zapewniają informacje specyficzne dla kultury, które są używane w formatowaniu lub analizowaniu wartości liczbowych oraz wartości daty i godziny:
NumberFormatInfo
Klasa, która dostarcza informacji, która jest używana do formatowania liczb, takich jak waluty, tysiące separatora i symboli separator dziesiętny dla danej kultury. Aby uzyskać informacje na temat wstępnie zdefiniowanych ciągów formatu rozpoznawanych przezNumberFormatInfo
obiekt i używanych w operacjach formatowania liczb, zobacz Standardowe ciągi formatujące liczby i Niestandardowe ciągi formatujące.DateTimeFormatInfo
Klasa, która dostarcza informacji, która jest używana do formatowania dat i czasów, takich jak data i godzina symboli Separator określonej kultury lub kolejności i formy komponentów rok, miesiąc i dzień na randkę. Aby uzyskać informacje o wstępnie zdefiniowanych ciągach formatu rozpoznawanych przez plikDateTimeFormatInfo
obiekt i używanych w operacjach formatowania liczbowego, zobacz standardowe formatujące datę i godzinę oraz niestandardowe ciągi formatujące datę i godzinę.CultureInfo
Klasa, która stanowi szczególną kulturę. JegoGetFormat
metoda zwraca obiekt specyficzny dla kulturyNumberFormatInfo
lubDateTimeFormatInfo
obiekt, w zależności od tego, czyCultureInfo
obiekt jest używany w operacji formatowania lub analizowania, która obejmuje liczby lub daty i godziny.NET Framework obsługuje również formatowanie niestandardowe. Zwykle wiąże się to z utworzeniem klasy formatowania, która implementuje zarówno IFormatProvider, jak i ICustomFormatter. Wystąpienie tej klasy jest następnie przekazywane jako parametr do metody, która wykonuje niestandardową operację formatowania, taką jak
String.Format(IFormatProvider, String, Object[])
.źródło
W DateTimeFormatInfo klasa implementuje ten interfejs, dzięki czemu pozwala kontrolować formatowanie ciągów DateTime.
źródło