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:
CultureInfoImplementuje 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ź.
IFormatProviderInterfejs jest zazwyczaj realizowane za ciebie przez CultureInfoklasy, np:
CultureInfo.CurrentCultureCultureInfo.CurrentUICultureCultureInfo.InvariantCultureCultureInfo.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 IFormatProvidermożna zapytać, to:
Sposób, w jaki normalnie by działał, polega na tym, że prosisz IFormatProvidero DateTimeFormatInfoprzedmiot:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Istnieje również wewnętrzna wiedza, że każdy IFormatProviderinterfejs jest prawdopodobnie implementowany przez klasę, która pochodzi CultureInfolub 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ć DateTimeFormatInfoodIFormatProvider :
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Aby otrzymać NumberFormatInfoodIFormatProvider :
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
Wartość IFormatProviderpolega na tym, że tworzysz własne obiekty kultury. Dopóki implementują IFormatProvideri zwracają obiekty, o które są proszone, można ominąć kultury wbudowane.
Możesz również użyć IFormatProviderdo przekazywania dowolnych obiektów kultury - przez IFormatProvider. Np. Imię boga w różnych kulturach
Dzięki temu Twoja niestandardowa LordsNameFormatInfoklasa jedzie w środku IFormatProvideri możesz zachować idiom.
W rzeczywistości nigdy nie będziesz musiał nazywać własnej GetFormatmetody IFormatProvider.
Zawsze, gdy potrzebujesz IFormatProvider, możesz przekazać CultureInfoobiekt:
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ż IFormatProvidernie 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.InvariantCulturezamiast CultureInfo.CurrentCulture?
nullbę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.CurrentInfoco jest równoważne z danymi CultureInfo.CurrentCulturewyjś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.
IFormatProvidernie 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:
NumberFormatInfoKlasa, 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 NumberFormatInfoobiekt i używanych w operacjach formatowania liczb, zobacz Standardowe ciągi formatujące liczby i Niestandardowe ciągi formatujące.DateTimeFormatInfoKlasa, 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ę.CultureInfoKlasa, która stanowi szczególną kulturę. Jego GetFormatmetoda zwraca obiekt specyficzny dla kultury NumberFormatInfolub DateTimeFormatInfoobiekt, w zależności od tego, czy CultureInfoobiekt 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.