Я играл с методом Datetime.ParseExact, и ему нужен IFormatProvider ...
Он работает с вводом нуля, но что именно он делает?
Я играл с методом Datetime.ParseExact, и ему нужен IFormatProvider ...
Он работает с вводом нуля, но что именно он делает?
Ответы:
В дополнение к ответу Яна Бойда:
Также 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
можно запросить:
Обычно это работает, когда вы просите 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"));
Примечание : любой код передается в общественное достояние. Ссылка на авторство не требуется.
Передача 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.