Pergunta

Eu estava brincando com o método DateTime.ParseExact, e quer um IFormatProvider ...

Ele funciona introduzindo nulo, mas o que exatamente ele faz?

Foi útil?

Solução

Em adition a resposta de Ian Boyd:

implementos Também CultureInfo esta interface e pode ser usado em seu caso. Assim, você poderá analisar uma seqüência de data Francês por exemplo; você poderia usar

var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);

Outras dicas

A interface IFormatProvider é normalmente implementadas por uma classe CultureInfo, por exemplo:.

  • CultureInfo.CurrentCulture
  • CultureInfo.CurrentUICulture
  • CultureInfo.InvariantCulture
  • CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)

A interface é uma porta de entrada para uma função para obter um conjunto de dados específicos da cultura de uma cultura. Os dois objetos de cultura comumente disponíveis que um IFormatProvider pode ser consultado para são:

  • DateTimeFormatInfo
  • NumberFormatInfo

A forma como ele faria normalmente o trabalho é você perguntar a IFormatProvider para dar-lhe um objeto DateTimeFormatInfo:

DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
   DoStuffWithDatesOrTimes(format);

Há também o conhecimento interior que qualquer interface IFormatProvider provavelmente está sendo implementado por uma classe que descende de CultureInfo ou desce do DateTimeFormatInfo, assim que você poderia lançar a interface diretamente:

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);

Mas não faça isso

Todo esse trabalho árduo já foi escrito para você:

Para obter um DateTimeFormatInfo de um IFormatProvider :

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

Para obter um NumberFormatInfo de um IFormatProvider :

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

O valor da IFormatProvider é que você criar seus próprios objetos de cultura. Enquanto eles implementar IFormatProvider, e retornar objetos que estão pediu, você pode ignorar o built-in culturas.

Você também pode usar IFormatProvider uma maneira de passar objetos de cultura arbitrárias - através do IFormatProvider. Por exemplo. o nome de Deus em diferentes culturas

  • deus
  • Deus
  • Jehova
  • Yahwe
  • ????
  • ???? ??? ????

Isso permite que o seu costume passeio de classe LordsNameFormatInfo ao longo dentro de um IFormatProvider, e você pode preservar o idioma.

Na realidade você nunca precisará chamar o método GetFormat de IFormatProvider si mesmo.

Sempre que você precisar de uma IFormatProvider você pode passar um objeto CultureInfo:

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));

Nota : Qualquer código é liberado para o domínio público. Sem atribuição necessário.

Passando nulo como o IFormatProvider não é a maneira correta de fazer isso. Se o usuário tem um formato de data / hora personalizado em seu PC, você terá problemas em análise e conversão para string. Acabei reparado um bug onde alguém tinha passado nulo como o IFormatProvider ao converter para string.

Em vez disso você deve estar usando CultureInfo.InvariantCulture

Errado:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);

correta:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);

Você pode ver aqui http://msdn.microsoft.com/ en-us / library / system.iformatprovider.aspx

Veja as observações e exemplo seção lá.

IFormatProvider fornece informações cultura para o método em questão. DateTimeFormatInfo implementos IFormatProvider, e permite que você especifique o formato você quer que seu data / hora para ser exibido em. Exemplos podem ser encontrados nas páginas relevantes do MSDN.

MSDN

A Framework inclui o seguinte três predefinido IFormatProvider implementações para fornecer informações específicas de cultura que é utilizado na formatação ou análise numérica e de data e hora valores:

  1. A classe NumberFormatInfo, que fornece informações que é usado para formatar números, como a moeda, milhares separador e símbolos de separador decimal para uma cultura particular. Para obter informações sobre as seqüências de formato predefinidos reconhecidos por um objeto NumberFormatInfo e utilizados em operações de formatação numérica, consulte formato numérico padrão Cordas e numéricos personalizado seqüências de formato.
  2. A classe DateTimeFormatInfo, que fornece informações que é usado para formatar datas e tempos, como os símbolos separadores de data e hora para uma cultura em particular ou a ordem eo formato dos componentes ano, mês e dia de uma data. Para obter informações sobre as seqüências de formato predefinidos reconhecidos por um objeto DateTimeFormatInfo e utilizados em operações de formatação numérica, consulte Data e formato padrão Tempo Cordas e Data personalizada e Hora cadeias de formato.
  3. A classe CultureInfo, o que representa uma cultura particular. Seu método GetFormat retorna um NumberFormatInfo ou DateTimeFormatInfo objeto específico da cultura, dependendo se o objeto CultureInfo é usado em uma operação de formatação ou análise que envolve números ou datas e horários.

O .NET Framework também suporta a formatação personalizada. Isto envolve normalmente a criação de uma classe de formatação que implementa tanto IFormatProvider e ICustomFormatter. Uma instância dessa classe é então passada como um parâmetro para um método que executa uma formatação personalizada operação, como String.Format(IFormatProvider, String, Object[]).

DateTimeFormatInfo classe implementa essa interface, por isso permite-lhe controlar a formatação de suas cordas data e hora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top