Я бавився з методом 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.CurrentCultureCultureInfo.CurrentUICultureCultureInfo.InvariantCultureCultureInfo.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.