Я бавився з методом 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
.
Перевірте API для http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx .
за MSDN
.NET Framework включає наступні три заздалегідь визначені реалізації IFormatProvider, щоб надати інформацію про культуру, яка використовується для форматування або синтаксичного аналізу числових значень та значень дати та часу:
NumberFormatInfo
Клас, який містить інформацію, яка використовується для форматування чисел, такі як валюта, роздільник тисяч і символів десяткового роздільника для конкретної культури. Інформацію про заздалегідь визначені рядки формату, розпізнані NumberFormatInfo
об’єктом і використовувані в операціях числового форматування, див. У рядках Стандартний числовий формат та Рядки користувацького числового формату.DateTimeFormatInfo
Клас, який містить інформацію, яка використовується для дати і часу в форматі, наприклад, дата і час символів роздільників для конкретної культури або порядку і форми компонентів року, місяця і дня Дейта. Для отримання інформації про визначені рядки формату, розпізнані aDateTimeFormatInfo
об’єктом і використовувані в операціях числового форматування, див. У розділі Стандартні рядки формату дати та часу та Спеціальні рядки формату дати та часу.CultureInfo
Клас, який представляє собою особливу культуру. Його GetFormat
метод повертає специфічну для культури NumberFormatInfo
або DateTimeFormatInfo
об’єкт, залежно від того, чи використовується CultureInfo
об’єкт в операції форматування або синтаксичного аналізу, що включає числа або дати та час..NET Framework також підтримує нестандартне форматування. Зазвичай це передбачає створення класу форматування, який реалізує як IFormatProvider, так і ICustomFormatter. Потім екземпляр цього класу передається як параметр методу, який виконує спеціальну операцію форматування, наприклад String.Format(IFormatProvider, String, Object[])
.
Клас DateTimeFormatInfo реалізує цей інтерфейс, тому він дозволяє контролювати форматування ваших рядків DateTime.