Использование инвариантной культуры с помощью IFormatProvider в DateTime.ParseExact

В первой перегрузке метода ParseExact

public static DateTime ParseExact (string s, string format, IFormatProvider provider);

в соответствии с Microsoft:

Если формат представляет собой шаблон пользовательского формата, который не включает разделители даты или времени (например, yyyyMMddHHmm "), используйте культуру инварианта для параметра поставщика и самую широкую форму каждого специализированного спецификатора формата. Например, если вы хотите указать часы в шаблоне формата, укажите более широкую форму «HH» вместо более узкой формы «H».

В частности, если мы используем шаблон формата stander, мы могли бы использовать любые другие культуры

, какова настоящая цель использования инвариантной культуры и самого широкого пользовательского спецификатора, если мы используем шаблон пользовательского формата, который не включать разделители даты или времени, если мы используем?

2
задан 13 August 2018 в 13:51

2 ответа

реальная цель инвариантной культуры взята из ответа в этом вопросе, поскольку она описывает ее цель лучше:

Не все культуры используют один и тот же формат для дат и десятичных / валютных значений. Это будет иметь значение для вас, когда вы конвертируете входные значения (чтение), которые сохраняются в виде строк в DateTime, float, double или decimal. Будет также важно, если вы попытаетесь отформатировать вышеупомянутые типы данных для строк (записи) для отображения или хранения. Если вы знаете, какую конкретную культуру могут указать ваши даты и десятичные / валютные значения, вы можете использовать это специфическое свойство CultureInfo (т. Е. CultureInfo («en-GB»)). Например, если вы ожидаете ввода пользователем. Свойство CultureInfo.InvariantCulture используется, если вы форматируете или разбираете строку, которая должна обрабатываться с помощью части программного обеспечения, независимо от локальных настроек пользователя.

Чтобы суммировать это, инвариантная культура поможет с преобразованием быть строкой, хранящейся в float, decimal или как DateTime, здесь также помогает, когда вы пытаетесь форматировать или анализировать строку, которая должен анализироваться с помощью программного обеспечения, независимого от локальных параметров пользователя, как сказано в цитате, и это то, что

Не все культуры используют один и тот же формат для дат и десятичных / валютных значений.

самый широкий пользовательский спецификатор

1
ответ дан 15 August 2018 в 17:04

Цель InvariantCulture - иметь хорошо известный способ форматирования дат и цифр, который не зависит от системы или пользовательской локали.

Вы должны использовать ее каждый раз, когда вы форматируете что-то который не должен анализироваться людьми. Например, в файле JSON или XML вы хотите сохранить дату в формате ISO, чтобы не было двусмысленности. С другой стороны, если вы показываете дату на экране, вы, как правило, уважаете выбор культуры и отображаете ее по-своему.

Если вы используете пользовательский формат, то было бы неплохо, если результирующая строка может быть проанализирована обратно в точно такие же дату и время. Для этого без разделителей вам нужно использовать строки фиксированной длины для каждого компонента.

// omitting CultureInfo.InvariantCulture for brevity
var dt = new DateTime(2018,1,2,3,45,6);
dt.ToString("yyyyMMddHHmmss") // returns "20180102034506"
dt.ToString("yyyyMdHms")      // returns "2018123456"

Вы можете легко видеть, что второй не уникален, т. Е. Есть другие даты, которые возвратят то же самое строка. Во избежание использования более широкой формы каждого компонента.

2
ответ дан 15 August 2018 в 17:04

Другие вопросы по тегам:

Похожие вопросы: