Pular para o conteúdo principal

Formatação de DateTime em C#/VB

É uma tarefa comum formatar instâncias de data e hora nas aplicações para correcto armazenamento ou apresentação. Felizmente, o objecto DateTime tem na sua definição métodos que permitem formatar o valor nos mais diversos formatos, o que simplifica o processo de apresentação de valores, mas não só. Por exemplo, numa base de dados SQLite (e não só), é conveniente enviar o valor da data e hora no formato correcto, para evitar erros nas operações.

O DateTime, como a generalidade das classes do framework, tem um método de ToString(), com diversos overloads, onde um deles é:


string DateTime.ToString(string format);


Este método admite uma string de formatação do valor que retorna, no formato de string. Se bem que a construção da string não é de todo difícil, é importante escolher a correcta e ter o cuidado de não confundir alguns casos de maiúsculas e minúsculas. Produzi um pequeno exemplo no Snippet Compiler para demonstrar o conceito, e as diferenças entre cada caracter ou combinação:

public static void RunSnippet()
{

DateTime agora = DateTime.Now; //02-09-2008 19:43:25

//ToString por defeito
WL("null :" + agora.ToString()); //02-09-2008 19:43:25

//date / time completos
WL("d : " + agora.ToString("d")); //02-09-2008
WL("D : " + agora.ToString("D")); //terça-feira, 2 de Setembro de 2008
WL("t : " + agora.ToString("t")); //19:43
WL("T : " + agora.ToString("T")); //19:43:25
WL("s : " + agora.ToString("s")); //2008-09-02T19:43:25
WL("f : " + agora.ToString("f")); //terça-feira, 2 de Setembro de 2008 19:43
WL("F : " + agora.ToString("F")); //terça-feira, 2 de Setembro de 2008 19:43:25
WL("g : " + agora.ToString("g")); //02-09-2008 19:43
WL("G : " + agora.ToString("G")); //02-09-2008 19:43:25
WL("r : " + agora.ToString("r")); //Tue, 02 Sep 2008 19:53:20 GMT
WL("u : " + agora.ToString("u")); //2008-09-02 19:53:20Z
WL("U : " + agora.ToString("U")); //terça-feira, 2 de Setembro de 2008 18:53:20

//formato de dia
WL("dd : " + agora.ToString("dd")); //02
WL("ddd : " + agora.ToString("ddd")); //ter
WL("dddd : " + agora.ToString("dddd")); //terça-feira

//formato do mês
WL("m : " + agora.ToString("m")); //2-9
WL("M : " + agora.ToString("M")); //2-9
WL("MM : " + agora.ToString("MM")); //09
WL("MMM : " + agora.ToString("MMM")); //Set
WL("MMMM : " + agora.ToString("MMMM")); //Setembro

//formato do ano
WL("y : " + agora.ToString("y")); //Setembro de 2008
WL("yy : " + agora.ToString("yy")); //08
WL("yyyy : " + agora.ToString("yyyy")); //2008

//horas
WL("hh : " + agora.ToString("hh")); //07
WL("HH : " + agora.ToString("HH")); //19

//minutos
WL("mm : " + agora.ToString("mm")); //45

//segundos
WL("ss : " + agora.ToString("ss")); //28
WL("ff : " + agora.ToString("ff")); //04
WL("fff : " + agora.ToString("fff")); //044
WL("ffff : " + agora.ToString("ffff")); //0446
WL("fffff : " + agora.ToString("fffff")); //04463 ...

//outros
WL("gg : " + agora.ToString("gg")); //D.C.
WL("tt : " + agora.ToString("tt")); // (deveria ser PM)
WL("zz : " + agora.ToString("zz")); //+01
WL("zzz : " + agora.ToString("zzz")); //+01:00

//toString parametrizados e separadores
WL("HH:mm:ss:ffff : "+ agora.ToString("HH:mm:ss:ffff")); //19:43:25:0446
WL("dd/MM/yyyy : "+ agora.ToString("dd/MM/yyyy")); //02/09/2008
WL("dd 'de' MM em yyyy : "+ agora.ToString("dd 'de' MM 'em' yyyy 'às' HH e mm")); //02 de 09 em 2008 às 19 e 43
WL(agora.ToString("dd-MM-yyyy HH:mm:ss")); //02-09-2008 19:43:28

}


Naturalmente, dada a especificidade dos nomes dos dias e meses, e mesmo a formatação das horas, os valores retornados pelo ToString() depende fortemente do da informação de cultura definido no System.Globalization do sistema onde corre as instruções. Este caso é para Português de Portugal.

Revendo o exemplo:

* Sem parmetro de formatação, obtemos um valor de data e hora perfeitamente valido para uso comum.
* Existe um conjunto de caracteres singulares que produzem uma data e hora completa. Dessas, apenas o 's' e o 'u' produzem saídas ordenáveis.
* O 'U' tem comportamento estranho e deve ser evitado.
* Os componentes individuais tem diversas formatações possíveis, dependendo do número de vezes que o caracter é usado.
* 'f' representa fracções de segundo. Cada 'f' acrescentado representa uma casa decimal extra na representação
* É muito importante não confundir 'M' de meses com 'm' de minutos. É um erro que nem sempre é fácil de detectar ou cujo resultado é evidentemente errado.
* É possível combinar os parâmetros de modo a criar novos que nos sirvam. Como separadores, podem ser usados o mais diversos caracteres, como espaços, dois pontos, barras, ou palavras. No caso de palavras, quando contem caracteres já definidos para formatação (como o 'd', o 'm', etc.) é importante envolver o(s) caracter(es) em aspas como 'às'. Basta envolver caracter crítico (como à's') mas é mais legível envolver a palavra completa.

Artigo de Miguel Alho
http://miguelalho.com/?p=674

Comentários

Postagens mais visitadas deste blog

A batalha por uma SafeKid (Unicamp)

Figura 1 - Cadeira Safekid (Unicamp) Nas consultas usando a ferramenta de busca do Google obtive os seguintes link para a tal cadeira. 1- http://revistacrescer.globo.com/Crescer/0,19125,EFC1010380-2213-2,00.html 2- http://www.ibiubi.com.br/produtos/cadeira-cinto-de-seguran%c3%a7a-safekid-projetado-pela-unicamp+beb%c3%aas-e-crian%c3%a7as+cadeiras/IUID4138740/ 3- http://compras.hsw.uol.com.br/assento-infantil-guia.htm 4- http://produto.mercadolivre.com.br/MLB-123086053-cadeiracinto-de-seguranca-safekid-projetado-pela-unicamp-_JM a própria! só que venda finalizada. Foi então que resolvi procurar no Bing (Microsoft) www.bing.com. Também não encontrei! Rs Encontrei algumas parecidas a preços imbatíveis, mas fora do país. 1- http://www.magazineluiza.com.br/produto/index_Produto.asp?Produto=1766074&linha=BB&Setor=CADA&modelo=08 2- http://www.precomania.com/search_attrib.php/page_id=1990/st=page/page=1 Mas foi no Yahoo buscas que eu encontrei a dita cuja. Quero dizer, um possível ...

Driver para Receptor de TV Digital da Multilaser RE003

Email recebido da central de atendimento da Multilaser para resolver problema de funcionamento do receptor digital em Windows 7. --------------------------------------------------------------------------------- Prezado(a) Cliente, Primeiramente pedimos desculpas por quaisquer transtornos causados. Segue anexo manual passo a passo para a instalação do RE003. Conseguimos desenvolver um novo software para o aparelho, pois o enviado no cd não estava conseguindo localizar canais. Peço a gentileza de seguir o passo a passo e me informar se conseguiu utilizar o produto. Os drivers que irá precisar estão disponíveis no link http://tinyurl.com/j3w3svn Os drivers que irá precisar estão disponíveis no link  http://tinyurl.com/j3w3svn Os drivers que irá precisar estão disponíveis no link  http://tinyurl.com/j3w3svn Instale os drivers e o software Presto! Serial: EVALUATION

EmguCV DLL Not Found Exception -Unable to find cvextern?

Eu também tive os mesmos problemas. Neste fórum emgucv , não sei por que cvextern.dlldo emgucv 3.4.3 não é possível carregar cvextern (porque não é possível encontrar cvextern), e você permitiu usar o arquivo cvextern.dlldo emgucv 3.4.2 (certifique-se de escolher x64 / x86), copie /bin/Debuge este arquivo é encontrado automaticamente /bin/Debug/x86ou /bin/Debug/x64quando você termina de construir o programa no Visual Studio.  O Erro:  The type initializer for 'Emgu.CV.CvInvoke' threw an exception. : Unable to load DLL 'cvextern': The specified module could not be found. (Exception from HRESULT: 0x8007007E)  Para resolver o problema copia a pasta x64 ou x86 para dentro da pasta bin da aplicação. Ou copie os arquivos para dentro da pasta bin da aplicação WCF.