Вопрос

Я играл с методом Datetime.ParseExact, и ему нужен IFormatProvider...

Он работает при вводе нуля, но что именно он делает?

Это было полезно?

Решение

В дополнение к ответу Яна Бойда:

Также CultureInfo реализует этот интерфейс и может быть использован в вашем случае.Например, вы можете проанализировать строку даты на французском языке;ты мог бы использовать

var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(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 и позволяет вам указать формат, в котором вы хотите, чтобы ваша дата/время отображались.Примеры можно найти на соответствующих страницах MSDN.

К MSDN

.NET Framework включает в себя следующее три предопределенные реализации IFormatProvider для предоставления информации, зависящей от языка и региональных параметров, которая используется при форматировании или анализе числовых значений, а также значений даты и времени:

  1. А NumberFormatInfo класс, который предоставляет информацию, используемую для форматирования чисел, такую ​​как денежная единица, разделитель тысяч и символы десятичного разделителя для определенной культуры.Для получения информации о строках предопределенного формата, распознаваемых NumberFormatInfo объект и используется в операциях числового форматирования, см. разделы «Строки стандартного числового формата» и «Строки пользовательского числового формата».
  2. А DateTimeFormatInfo класс, который предоставляет информацию, используемую для форматирования даты и времени, например символы разделителя даты и времени для определенного языка и региональных параметров или порядок и формат компонентов года, месяца и дня даты.Для получения информации о строках предопределенного формата, распознаваемых DateTimeFormatInfo объект и используется в операциях числового форматирования, см. разделы «Строки стандартного формата даты и времени» и «Строки пользовательского формата даты и времени».
  3. А CultureInfo класс, который представляет определенную культуру.Его GetFormat метод возвращает специфичный для культуры NumberFormatInfo или DateTimeFormatInfo объект, в зависимости от того, CultureInfo Объект используется в операции форматирования или синтаксического анализа, которая включает числа, даты и время.

.NET Framework также поддерживает пользовательское форматирование.Обычно это предполагает создание класса форматирования, реализующего как IFormatProvider, так и ICustomFormatter.Экземпляр этого класса затем передается в качестве параметра методу, который выполняет пользовательскую операцию форматирования, например String.Format(IFormatProvider, String, Object[]).

В ДатаВремяФорматИнфо класс реализует этот интерфейс, поэтому он позволяет вам контролировать форматирование строк DateTime.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top