Eu estava brincando com o método Datetime.ParseExact e ele quer um IFormatProvider ...
Funciona inserindo null, mas o que exatamente faz?
c#
asp.net
iformatprovider
Moulde
fonte
fonte
Respostas:
Além da resposta de Ian Boyd:
Também
CultureInfo
implementa essa interface e pode ser usada no seu caso. Portanto, você pode analisar uma string de data em francês, por exemplo; você poderia usarfonte
DateTime.ParseExact(string, string, IFormatProvider)
vez disso, eu acredito - como tal:DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
DateTime dt = DateTime.Parse(yourDateInputString, ci);
Por favor, revise sua resposta.A
IFormatProvider
interface é normalmente implementada para você por umaCultureInfo
classe, por exemplo:CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
A interface é um portal para uma função obter um conjunto de dados específicos da cultura de uma cultura. Os dois objetos de cultura comumente disponíveis que
IFormatProvider
podem ser consultados são:DateTimeFormatInfo
NumberFormatInfo
A maneira como normalmente funcionaria é você pedir ao
IFormatProvider
para lhe dar umDateTimeFormatInfo
objeto:Também há conhecimento interno de que qualquer
IFormatProvider
interface provavelmente está sendo implementada por uma classe que desceCultureInfo
ou desce deDateTimeFormatInfo
, então você pode lançar a interface diretamente:Mas não faça isso
Todo esse trabalho árduo já foi escrito para você:
Para obter um
DateTimeFormatInfo
de umIFormatProvider
:Para obter um
NumberFormatInfo
de umIFormatProvider
:O valor de
IFormatProvider
é que você cria seus próprios objetos de cultura. Contanto que eles implementemIFormatProvider
e retornem os objetos pelos quais são solicitados, você pode ignorar as culturas integradas.Você também pode usar
IFormatProvider
como uma forma de passar objetos de cultura arbitrários - por meio doIFormatProvider
. Por exemplo, o nome de deus em diferentes culturasIsso permite que sua
LordsNameFormatInfo
classe personalizada circule dentro de umIFormatProvider
, e você pode preservar o idioma.Na realidade, você nunca precisará chamar o
GetFormat
método deIFormatProvider
si mesmo.Sempre que precisar de um,
IFormatProvider
você pode passar umCultureInfo
objeto:fonte
Passar nulo como
IFormatProvider
não é a maneira correta de fazer isso. Se o usuário tiver um formato de data / hora personalizado em seu PC, você terá problemas para analisar e converter para string. Acabei de consertar um bug em que alguém passou null como IFormatProvider ao converter para string.Em vez disso, você deve usar
CultureInfo.InvariantCulture
Errado:
Corrigir:
fonte
CultureInfo.InvariantCulture
vez deCultureInfo.CurrentCulture
?null
o padrão paraCultureInfo.CurrentCulture
. Veja a chamada na fonte de referência , se você seguir a cadeia de chamadas, o nulo eventualmente será substituído porDateTimeFormatInfo.CurrentInfo
qual é equivalente a quaisCultureInfo.CurrentCulture
saídas.IFormatProvider fornece informações de cultura para o método em questão. DateTimeFormatInfo implementa IFormatProvider e permite que você especifique o formato no qual deseja que sua data / hora seja exibida. Os exemplos podem ser encontrados nas páginas relevantes do MSDN.
fonte
Você pode ver aqui http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
Veja as observações e a seção de exemplos aqui.
fonte
IFormatProvider
não usaIFormatProvider
.Verifique http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx para a API.
fonte
Por MSDN
O .NET Framework inclui as seguintes três implementações predefinidas de IFormatProvider para fornecer informações específicas da cultura que são usadas na formatação ou análise de valores numéricos e de data e hora:
NumberFormatInfo
classe, que fornece informações usadas para formatar números, como moeda, separador de milhares e símbolos separadores decimais para uma cultura específica. Para obter informações sobre as strings de formato predefinidas reconhecidas por umNumberFormatInfo
objeto e usadas em operações de formatação numérica, consulte Strings de formato numérico padrão e Strings de formato numérico personalizado.DateTimeFormatInfo
classe, que fornece informações que são usadas para formatar datas e horas, como os símbolos separadores de data e hora para uma cultura específica ou a ordem e formato dos componentes de ano, mês e dia de uma data. Para obter informações sobre as strings de formato predefinidas reconhecidas por umDateTimeFormatInfo
objeto e usadas em operações de formatação numérica, consulte Strings de formato de data e hora padrão e Strings de formato de data e hora personalizados.CultureInfo
classe, que representa uma cultura particular. SeuGetFormat
método retorna um objetoNumberFormatInfo
ou específico da culturaDateTimeFormatInfo
, dependendo se oCultureInfo
objeto é usado em uma operação de formatação ou análise que envolve números ou datas e horas.O .NET Framework também oferece suporte à formatação personalizada. Isso normalmente envolve a criação de uma classe de formatação que implementa IFormatProvider e ICustomFormatter. Uma instância dessa classe é então passada como um parâmetro para um método que executa uma operação de formatação personalizada, como
String.Format(IFormatProvider, String, Object[])
.fonte
A classe DateTimeFormatInfo implementa essa interface, portanto, permite que você controle a formatação de suas strings DateTime.
fonte