Я играл с методом Datetime.ParseExact, и ему нужен IFormatProvider ...
Он работает с вводом нуля, но что именно он делает?
c#
asp.net
iformatprovider
Moulde
источник
источник
Ответы:
В дополнение к ответу Яна Бойда:
Также
CultureInfo
реализует этот интерфейс и может быть использован в вашем случае. Так, например, вы можете разобрать строку даты на французском языке; вы могли бы использоватьvar ci = new CultureInfo("fr-FR"); DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
источник
DateTime.ParseExact(string, string, IFormatProvider)
Я считаю, что вы должны использовать вместо этого - как таковые:DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
DateTime dt = DateTime.Parse(yourDateInputString, 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
:Чтобы получить
NumberFormatInfo
отIFormatProvider
:Ценность в
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"));
источник
Передача null в
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);
источник
CultureInfo.InvariantCulture
вместоCultureInfo.CurrentCulture
?null
умолчанию будетCultureInfo.CurrentCulture
. См. Вызов в справочном источнике , если вы проследите цепочку вызовов, в конечном итоге будет заменен нуль,DateTimeFormatInfo.CurrentInfo
который эквивалентен тем, какиеCultureInfo.CurrentCulture
выходы.IFormatProvider предоставляет информацию о культуре для рассматриваемого метода. DateTimeFormatInfo реализует IFormatProvider и позволяет указать формат, в котором должны отображаться дата / время. Примеры можно найти на соответствующих страницах MSDN.
источник
Вы можете увидеть здесь http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
См. Раздел примечания и примеры.
источник
IFormatProvider
не используетсяIFormatProvider
.Проверьте http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx для API.
источник
Автор MSDN
.NET Framework включает следующие три предопределенные реализации IFormatProvider для предоставления информации, зависящей от языка и региональных параметров, которая используется при форматировании или анализе числовых значений и значений даты и времени:
NumberFormatInfo
Класс, который содержит информацию, которая используется для форматирования чисел, такие как валюта, разделителя тысяч и символов десятичного разделителя для конкретной культуры. Для получения информации о стандартных строках формата, распознаваемыхNumberFormatInfo
объектом и используемых в операциях числового форматирования, см. Разделы Стандартные строки числового формата и Строки настраиваемого числового формата.DateTimeFormatInfo
Класс, который содержит информацию, которая используется для даты и времени в формате, например, дата и время символов разделителей для конкретной культуры или порядка и формы компонентов года, месяца и дня Дейта. Для получения информации о стандартных строках формата, распознаваемыхDateTimeFormatInfo
объектом и используемых в операциях числового форматирования, см. Разделы Стандартные строки формата даты и времени и Строки настраиваемого формата даты и времени.CultureInfo
Класс, который представляет собой особую культуру. ЕгоGetFormat
метод возвращает объектNumberFormatInfo
или языкDateTimeFormatInfo
, зависящий от языка и региональных параметров, в зависимости от того, используется лиCultureInfo
объект в операции форматирования или анализа, которая включает числа или даты и время..NET Framework также поддерживает настраиваемое форматирование. Обычно это включает создание класса форматирования, который реализует как IFormatProvider, так и ICustomFormatter. Затем экземпляр этого класса передается в качестве параметра методу, который выполняет операцию настраиваемого форматирования, например
String.Format(IFormatProvider, String, Object[])
.источник
Класс DateTimeFormatInfo реализует этот интерфейс, поэтому он позволяет вам управлять форматированием ваших строк DateTime.
источник