Я играл с методом Datetime.ParseExact, и он хочет IFormatProvider...
Он выполняет ввод значения null, но что именно он делает?
Я играл с методом Datetime.ParseExact, и он хочет IFormatProvider...
Он выполняет ввод значения null, но что именно он делает?
Также CultureInfo реализует этот интерфейс и может использоваться в вашем случае. Таким образом, вы можете проанализировать французскую строку даты, например; вы можете использовать
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.Parse(yourDateInputString, yourFormatString, ci);
Интерфейс IFormatProvider
обычно реализуется для вас классом CultureInfo
, например:
CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
Интерфейс является шлюзом для функции, позволяющей получить набор данных, относящихся к культуре, из культуры. Двумя общедоступными объектами культуры, которые могут запросить IFormatProvider
, являются:
DateTimeFormatInfo
NumberFormatInfo
Как обычно это работает, вы запрашиваете IFormatProvider
, чтобы дать вам объект DateTimeFormatInfo
:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Внутри также известно, что любой интерфейс IFormatProvider
, вероятно, реализуется классом, который спускается от CultureInfo
или спускается от DateTimeFormatInfo
, поэтому вы можете напрямую использовать интерфейс:
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);
Вся эта тяжелая работа уже написана для вас:
Чтобы получить DateTimeFormatInfo
из IFormatProvider
:
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Чтобы получить NumberFormatInfo
из IFormatProvider
:
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
Значение IFormatProvider
заключается в том, что вы создаете свои собственные объекты культуры. Пока они реализуют IFormatProvider
и возвращают объекты, о которых их просят, вы можете обойти встроенные культуры.
Вы также можете использовать IFormatProvider
для способа передачи произвольных объектов культуры - через IFormatProvider
. Например. имя бога в разных культурах
Это позволяет вашему пользовательскому классу LordsNameFormatInfo
перемещаться внутри IFormatProvider
, и вы можете сохранить идиом.
В действительности вам никогда не нужно будет вызывать GetFormat
метод IFormatProvider
самостоятельно.
Всякий раз, когда вам нужен IFormatProvider
, вы можете передать объект CultureInfo
:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Примечание. Любой код выпущен в общедоступном домене. Не требуется атрибуция.
Передача нулевого значения в качестве IFormatProvider
не является правильным способом. Если пользователь имеет собственный формат даты и времени на своем ПК, у вас возникнут проблемы при разборе и преобразовании в строку. Я только что исправил ошибку, когда кто-то передал null в качестве IFormatProvider при преобразовании в строку.
Вместо этого вы должны использовать CultureInfo.InvariantCulture
Неправильно:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);
Правильно:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
Здесь вы можете увидеть http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
Смотрите раздел замечаний и примеров.
IFormatProvider предоставляет информацию о культуре этому методу. DateTimeFormatInfo реализует IFormatProvider и позволяет указать формат, в котором вы хотите отображать дату/время. Примеры можно найти в соответствующих Страницы MSDN.
Отметьте http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx для API.
.NET Framework включает следующие предопределенные реализации IFormatProvider три, чтобы предоставить информацию, относящуюся к культуре, которая используется при форматировании или анализе чисел и значений даты и времени:
NumberFormatInfo
, который предоставляет информацию, которая используется для форматирования чисел, таких как символы разделителя валют, разделители тысяч и десятичные разделители для определенной культуры. Сведения о предопределенных строках формата, распознаваемых объектом NumberFormatInfo
и используемых в числовых операциях форматирования, см. В разделе Строки стандартного числового формата и строки пользовательского числового формата.DateTimeFormatInfo
, который предоставляет информацию, которая используется для форматирования дат и времени, таких как символы разделителя даты и времени для определенной культуры или порядок и формат компонентов даты, месяца и дня. Сведения о предопределенных строках формата, распознаваемых объектом DateTimeFormatInfo
и используемых в числовых форматированиях, см. В разделе Стандартные строки даты и времени и строки пользовательского формата даты и времени.CultureInfo
, представляющий определенную культуру. Его метод GetFormat
возвращает специфический для культуры объект NumberFormatInfo
или DateTimeFormatInfo
, в зависимости от того, используется ли объект CultureInfo
в операции форматирования или разбора, которая включает числа или даты и время..NET Framework также поддерживает настраиваемое форматирование. Обычно это связано с созданием класса форматирования, который реализует как IFormatProvider, так и ICustomFormatter. Затем экземпляр этого класса передается в качестве параметра методу, который выполняет пользовательскую операцию форматирования, например String.Format(IFormatProvider, String, Object[])
.
DateTimeFormatInfo класс реализует этот интерфейс, поэтому он позволяет вам управлять форматированием строк DateTime.