Eu estava brincando com o método Datetime.ParseExact e ele quer um IFormatProvider ...
Funciona inserindo null, mas o que exatamente faz?
Eu estava brincando com o método Datetime.ParseExact e ele quer um IFormatProvider ...
Funciona inserindo null, mas o que exatamente faz?
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 usar
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
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 uma CultureInfo
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:
A maneira como normalmente funcionaria é você pedir ao IFormatProvider
para lhe dar um DateTimeFormatInfo
objeto:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Também há conhecimento interno de que qualquer IFormatProvider
interface provavelmente está sendo implementada por uma classe que desce CultureInfo
ou desce de DateTimeFormatInfo
, então você pode 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);
Todo esse trabalho árduo já foi escrito para você:
Para obter um DateTimeFormatInfo
de umIFormatProvider
:
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Para obter um NumberFormatInfo
de umIFormatProvider
:
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
O valor de IFormatProvider
é que você cria seus próprios objetos de cultura. Contanto que eles implementem IFormatProvider
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 do IFormatProvider
. Por exemplo, o nome de deus em diferentes culturas
Isso permite que sua LordsNameFormatInfo
classe personalizada circule dentro de um IFormatProvider
, e você pode preservar o idioma.
Na realidade, você nunca precisará chamar o GetFormat
método de IFormatProvider
si mesmo.
Sempre que precisar de um, IFormatProvider
você pode passar um CultureInfo
objeto:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Nota : Qualquer código é lançado em domínio público. Nenhuma atribuição necessária.
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:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);
Corrigir:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
CultureInfo.InvariantCulture
vez de CultureInfo.CurrentCulture
?
null
o padrão para CultureInfo.CurrentCulture
. Veja a chamada na fonte de referência , se você seguir a cadeia de chamadas, o nulo eventualmente será substituído por DateTimeFormatInfo.CurrentInfo
qual é equivalente a quais CultureInfo.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.
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.
IFormatProvider
não usa IFormatProvider
.
Verifique http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx para a API.
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 um NumberFormatInfo
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 um DateTimeFormatInfo
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. Seu GetFormat
método retorna um objeto NumberFormatInfo
ou específico da cultura DateTimeFormatInfo
, dependendo se o CultureInfo
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[])
.
A classe DateTimeFormatInfo implementa essa interface, portanto, permite que você controle a formatação de suas strings DateTime.