sábado, 17 de maio de 2014

Classe Calendar

Classe Calendar 
No Java o tempo é representado em milissegundos que são contados a partir 01/01/1970 (Unix epoch), assim valores negativos representam datas anteriores a esta. 
Existem outras classes de manipulação de data, como Date e DateFormat. A classe Date retorna a data de acordo com  o sistema instalado. A maioria de seus métodos não são mais usados por não oferecer formatos de data usados em outras culturas. A classe DateFormat é uma classe de formatação de datas e horários que tanto formata como analisa. 
  • A Classe Calendar 
A classe Calendar faz parte do pacote java.util. É uma classe abstrata que expõe métodos tanto para conversão de períodos de tempo para os campos de um calendário comum, como ano, mês e outros, e também para manipulação de campos do calendário como um dia da próxima semana. Sendo uma classe abstrata, ela não pode ser instanciada, portanto é necessário utilizar um método estático. Seu principal método, getInstance(), retorna um calendário Gregoriano com valor inicial que reflete a data atual do sistema.
Calendar agora = Calendar.getInstance();
Esta classe é mais usada quando se necessita manipular datas.

The Calendar class is an abstract class that provides methods for converting between a specific instant in time and a set of calendar fields such as YEAR, MONTH, DAY_OF_MONTH, HOUR, and so on, and for manipulating the calendar fields, such as getting the date of the next week. An instant in time can be represented by a millisecond value that is an offset from the Epoch, January 1, 1970 00:00:00.000 GMT (Gregorian).  
The class also provides additional fields and methods for implementing a concrete calendar system outside the package. Those fields and methods are defined as protected.  
Like other locale-sensitive classes, Calendar provides a class method, getInstance, for getting a generally useful object of this type. Calendar's getInstance method returns a Calendar object whose calendar fields have been initialized with the current date and time. 
-- java docs --

  • Métodos get e set para a classe Calendar 
A classe Calendar fornece métodos GET e SET para alguns de seus campos. Com o método GET é possivel alterar qualquer campo do calendário e o método SET retorna a informação de qualquer campo do calendário. 
Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.YEAR, 2010); // alterando o ano para 2010 
calendar.get(Calendar.YEAR); // recuperando seu valor

Alguns dos campos que podem ser manipulados:  
  • Calendar.YEAR 
  • Calendar.MONTH 
  • Calendar.DAY_OF_MONTH
  • Calendar.HOUR 
  • Calendar.MINUTE 
  • Calendar.SECOND 

Quando o valor é alterado pelo método set(), ele altera o campo do calendário sem alterar o tempo em milissegundos. Este apenas será computado quando um método como get() for chamado. Assim se for alterado o campo mês do calendário, da data 31/08/2014, por exemplo, para Setembro, temporariamente a data será 31/09/2014 e quando um get() for chamado ele vai retornar 01/10/2014.  
Existem ainda duas outras maneiras de manipular os campos, que são o uso dos métodos add() e roll(). O método add() vai forçar a atualização do tempo em milissegundos do calendário imediatamente. Já o método roll() dispara inicialmente um método Calendar.complete() que normaliza os campos do calendário. Se a leniência for falsa e existir algum campo fora do seu intervalo vai ocorrer uma exceção. O método roll() adiciona valores ao campo sem alterar os valores dos campos maiores. Como exemplo se adicionarmos 8 meses a data de 31/08/2014 ela vai ser ajustada para 30/04/2014. Como Abril não tem 31 dias o valor provável mais próximo é usado. 

  • Leniência 
Quando a classe Calendar é leniente, ela aceita uma gama de entradas muito maior do que ela produz. Por exemplo, para um mês igual a janeiro e um dia do mês igual a 32, janeiro não tem 32 dias, ele devolve uma data que corresponde a 1º de fevereiro. Se a classe não é leniente ela devolve uma exceção se a entrada estiver fora da faixa de valores do campo. O valor inicial padrão é leniente, mas pode-se ajustar para não leniente da seguinte forma:

Calendar calendario = Calendar.getInstance(); 
calendario.setLenient(false); 

  • Exemplos práticos do uso da classe Calendar e seus principais métodos 
- Retornado a data atual:

Calendar calendario = Calendar.getInstance(); 
      System.out.println(calendario.getTime());
 
output: Wed May 07 12:00:00 BRT 2014

- Retornando o ano, mês e dia a partir de uma data: 
Lembre-se que nos valores inteiros que representam os meses, 0 indica Janeiro e 11 Dezembro.

      System.out.println(calendario.get(Calendar.YEAR));

output: 2014

      System.out.
println(calendario.get(Calendar
.MONTH));


output: 05

      System.out.
println(calendario.get(Calendar
.DAY_OF_MONTH));

output: 07

- Somando um dia à data atual e retornado a nova data: 

calendario.add(calendario.DAY_OF_MONTH, 1); 
      System.out.println(calendario.getTime());

output: Thu May 08 12:00:00 BRT 2014

- Alterando um mês do calendário: 

System.out.println(calendario.getTime()); 
calendario.set(calendario.MONTH, Calendar.DECEMBER); 
      System.out.println(calendario.getTime());

output: Wed May 07 12:00:00 BRT 2014        
        Sun
Dec 07 1
2:00:00 BRST 2014

- Subtraindo um ano da data atual: 

calendario.add(calendario.YEAR, -1); 
      System.out.println(calendario.getTime());

output: Tue May 07 12:00:00 BRT 2013

- Retornando a data correspondente a um epoch: 

long data_Em_milissegundos = 1234567890; 
calendario.setTimeInMillis(data_Em_milissegundos); 
      System.out.println(calendario.getTime());

output: Thu Jan 15 03:56:07 BRT 1970

- Retornando uma String do dia da semana em português:  

São passados 3 parâmetros:  campo do calendário, estilo da formatação que pode ser SHORT, LONG ou ALL_STYLES e local. Para usar em inglês, por exemplo, Locale.ENGLISH ou o valor local usando Locale.getDefault(). 

      System.out.println(calendario.getDisplayName(Calendar.DAY_OF_WEEK,
Calendar.LONG, Locale.getDefault()));


output: Quarta-feira

- Uso do método roll() adicionando meses à data atual 

System.out.println(calendario.getTime()); 
      calendario.roll(Calendar.MONTH, 15);
      System.out.println(calendario.getTime());

output: Fri May 16 17:00:00 BRT 2014        
       
Sat Aug 16 17:00:00 BRT 2014

  •  Principais métodos 
      getDisplayName - retorna uma String que representa um campo do calendário. 
      getTime() - retorna a data do calendário. 
      getTimeInMillis() - retorna o tempo em milissegundos. 
      setLenient() - especifica a data como leniente ou não. 
      setTime() - especifica uma data no calendário. 
      setTimeInMillis() - especifica um tempo no calendário a partir de um valor do tipo long. 

  • Resolução dos campos do calendário 
Quando os dados são passados para o calendário, podem existem valores insuficientes ou inconsistentes, como informar a data Quarta-feira 15 de Dezembro de 2011 quando este dia na realidade se refere a uma Quinta-feira. Ainda assim a classe vai passar o valor e para isso vai priorizar a entrada de dados de acordo com a sua ordem de entrada.  

  • Formatando as saídas 
Quando é criada uma instância da classe  Calendar, a data retornada vem no seguinte formato: 
Calendar calendario = Calendar.getInstance(); 
System.out.println(calendario.getTime());

output: Mon Apr 28 17:58:23 BRT 2014

             Para formatar a saída para o padrão brasileiro, por exemplo, dia/mês/ano, é preciso fazer uso de uma outra classe chamada SimpleDateFormat, no pacote java.text.SimpleDateFormat.

      SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");       System.out.println(df.format(calendar.getTime()));

output: 28/04/2014

  • Exercícios 
    Treine um pouco do que você aprendeu hoje fazendo os exercícios abaixo. Não deixe de testar os exemplos desenvolvidos acima. Mude seus valores e observe os resultados.
  1. Qual a função dos métodos get e set na classe Calendar? 
  1. Qual a função da leniência? 
  1. No código abaixo, qual saída no console será produzida:  
      Calendar calendar = new Calendar();  
      System.out.println(calendar.getInstance().getTime()); 
  1. Escreva um código que retorne o dia da semana correspondente a data de 05 de Maio de 2014: 
  1. Adicione um dia ao epoch 1234567890 e exiba a data resultante. 

  • Vídeos de interesse:
  • Links de interesse: 


Grupo Javali (Carlos Marinho, Renan Roseno, Gerson da Silva e Carlos Henckes)

Nenhum comentário:

Postar um comentário