Bawiłem się metodą Datetime.ParseExact, a ona potrzebuje IFormatProvider ...
Działa, wprowadzając wartość null, ale co dokładnie robi?
Bawiłem się metodą Datetime.ParseExact, a ona potrzebuje IFormatProvider ...
Działa, wprowadzając wartość null, ale co dokładnie robi?
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);
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 przez CultureInfo
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:
Sposób, w jaki normalnie by działał, polega na tym, że prosisz IFormatProvider
o DateTimeFormatInfo
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 pochodzi CultureInfo
lub pochodzi z DateTimeFormatInfo
, 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);
Cała ta ciężka praca została już dla Ciebie napisana:
Aby otrzymać DateTimeFormatInfo
odIFormatProvider
:
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Aby otrzymać NumberFormatInfo
odIFormatProvider
:
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
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 - przez IFormatProvider
. Np. Imię boga w różnych kulturach
Dzięki temu Twoja niestandardowa LordsNameFormatInfo
klasa jedzie w środku IFormatProvider
i możesz zachować idiom.
W rzeczywistości nigdy nie będziesz musiał nazywać własnej GetFormat
metody IFormatProvider
.
Zawsze, gdy potrzebujesz IFormatProvider
, możesz przekazać CultureInfo
obiekt:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Uwaga : każdy kod jest udostępniany w domenie publicznej. Nie jest wymagane podanie źródła.
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);
CultureInfo.InvariantCulture
zamiast CultureInfo.CurrentCulture
?
null
będzie domyślnie CultureInfo.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 danymi CultureInfo.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.
Możesz zobaczyć tutaj http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
Zobacz tam uwagi i przykłady.
IFormatProvider
nie używa IFormatProvider
.
Sprawdź http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx dla API.
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 przez NumberFormatInfo
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ę. Jego GetFormat
metoda zwraca obiekt specyficzny dla kultury NumberFormatInfo
lub DateTimeFormatInfo
obiekt, w zależności od tego, czy CultureInfo
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[])
.
W DateTimeFormatInfo klasa implementuje ten interfejs, dzięki czemu pozwala kontrolować formatowanie ciągów DateTime.