Um guia para SimpleDateFormat

Um guia para SimpleDateFormat

1. Introdução

Neste tutorial, vamos pegar umin-depth tour of the SimpleDateFormat class.

Vamos dar uma olhada emsimple instantiationand formatting styles, bem como métodos úteis que a classe expõe parahandling locales and time zones.

Agora, antes de começar, vamos ter em mente queSimpleDateFormat  não é seguro para threads. Portanto, tomar as precauções apropriadas em ambientes concorrentes é deixado para os desenvolvedores.

2. Instanciação Simples

Primeiro, vamos ver como instanciar um novo objetoSimpleDateFormat .

Existem4 possible constructors - mas de acordo com o nome, vamos manter as coisas simples. Tudo o que precisamos para começar é umString representation of a date pattern we want.

Vamos começar com um padrão de data separado por traços, assim:

"dd-MM-yyyy"

Isso formatará corretamente uma data começando com o dia atual do mês, o mês atual do ano e, finalmente, o ano atual. Podemos testar nosso novo formatador com um simples teste de unidade. Vamos instanciar um novoSimpleDateFormat objeto e passar uma data conhecida:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
assertEquals("24-05-1977", formatter.format(new Date(233345223232L)));

No código acima, oformatter converte milissegundos emlong into uma data legível por humanos - 24 de maio de 1977.

2.1. Métodos de Fábrica

EmboraSimpleDateFormat seja uma classe útil para construir rapidamente um formatador de data,we’re encouraged to use the factory methods on the DateFormat classgetDateFormat(),getDateTimeFormat(),getTimeFormat().

O exemplo acima parece um pouco diferente ao usar estes métodos de fábrica:

DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT);
assertEquals("5/24/77", formatter.format(new Date(233345223232L)));

Como podemos ver acima, o número de opções de formatação é pré-determinado pelofields on the DateFormat class. Isso em grande parterestricts our available options for formatting, é por isso que vamos nos limitar aSimpleDateFormat neste artigo.

3. Datas de análise

SimpleDateFormat andDateFormat not apenas nos permite formatar datas - mas também podemos reverter a operação. Usando o métodoparse , podemosinput the String representation of a date and return the Date objectar equivalente:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
Date myDate = new Date(233276400000L);
Date parsedDate = formatter.parse("24-05-1977");
assertEquals(myDate.getTime(), parsedDate.getTime());

É importante notar aqui quepattern supplied in the constructor should be in the same format as the date parsed usando o métodoparse .


4. Padrões de data e hora

SimpleDateFormat soferece uma vasta gama de opções diferentes ao formatar datas. Embora a lista completa esteja disponível emJavaDocs, vamos explorar algumas das opções mais comumente usadas:

Carta

Componente de Data

Exemplo

M

Mês

12; Dez

y

year

94

d

day

23; seg

H

hour

03

m

minuto

57

Ooutput returned by the date component also depends heavily on the number of characters used emString. Por exemplo, vamos pegar o mês de junho. Se definirmos a sequência de datas como:

"MM"

Em seguida, nosso resultado aparecerá como o código numérico - 06. No entanto, se adicionarmos outro M à nossa sequência de datas:

"MMM"

Em seguida, nossa data formatada resultante aparece como a palavraJun.

5. Aplicando localidades

OSimpleDateFormat class tambémsupports a wide range of locales que é definido quando o construtor é chamado.

Vamos colocar isso em prática formatando uma data em francês. Instanciaremos umSimpleDateFormat objeto enquanto fornecemosLocale.FRANCE ao construtor.

SimpleDateFormat franceDateFormatter = new SimpleDateFormat("EEEEE dd-MMMMMMM-yyyy", Locale.FRANCE);
Date myWednesday = new Date(1539341312904L);
assertTrue(franceDateFormatter.format(myWednesday).startsWith("vendredi"));

Ao fornecer uma determinada data, uma quarta-feira à tarde, podemos afirmar que nossofranceDateFormatter  formatou a data corretamente. A nova data começa corretamente comVendredi -French para quarta-feira!

Vale a pena observar um pequeno problema emLocale version of the constructor -whilst many locales are supported, full coverage is not guaranteed. A Oracle recomenda usar os métodos de fábrica emDateFormat class para garantir a cobertura local.

6. Mudança de fuso horário

ComoSimpleDateFormat extende a classeDateFormat , também podemosmanipulate the time zone using the setTimeZone method. Vamos dar uma olhada nisso em ação:

Date now = new Date();

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE dd-MMM-yy HH:mm:ssZ");

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Europe/London"));
logger.info(simpleDateFormat.format(now));

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
logger.info(simpleDateFormat.format(now));

No exemplo acima, fornecemos o mesmoDate para dois fusos horários diferentes no mesmo objetoSimpleDateFormat. Também adicionamos o‘Z' character to the end of the pattern String to indicate the time zone differences. A saída do métodoformat é então registrada para o usuário.

Ao executar a execução, podemos ver os horários atuais em relação aos dois fusos horários:

INFO: Friday 12-Oct-18 12:46:14+0100
INFO: Friday 12-Oct-18 07:46:14-0400

7. Sumário

Neste tutorial, mergulhamos profundamente nas complexidades deSimpleDateFormat.

Vimos comoinstantiate SimpleDateFormat  e também comopattern String impacts how the date is formatted.

Brincamos comchanging the locales da string de saída antes de finalmente experimentarusing time zones.

Como sempre, o código-fonte completo pode ser encontradoover on Github.