1. Mudando de Date
classe para Calendar
classe
Os programadores adoraram a Date
classe por sua simplicidade e suporte aos padrões Unix, mas como você sabe, toda rosa tem seus espinhos.
Os programadores queriam uma Date
classe "inteligente". E eles conseguiram o que queriam na forma da Calendar
aula. Foi concebido como uma forma não só de armazenar datas, mas também de realizar operações difíceis com datas.
O nome completo da Calendar
classe é java.util.Calendar. Não se esqueça de adicioná-lo a uma instrução de importação se decidir usá-lo em seu código.
Você pode criar um Calendar
objeto com este comando:
Calendar date = Calendar.getInstance();
O método estático getInstance()
da Calendar
classe cria um Calendar
objeto inicializado com a data atual. O calendário que você deseja será criado com base nas configurações do computador que executa o programa.
Ou, mais precisamente, o calendário que você obtém... Isso ocorre porque os humanos na Terra não estão limitados a um único calendário. Em vez disso, eles usam muitos. E quase todos eles estão associados a alguma religião ou país. A Calendar
classe suporta 3 deles:
Calendário | Descrição |
---|---|
Calendário gregoriano | calendário gregoriano cristão |
calendário budista | calendário budista |
Calendário Imperial Japonês | calendário imperial japonês |
Mas também existem calendários chinês e árabe. Basicamente, trabalhar com o tempo não é tão fácil quanto parece.
No calendário chinês, o ano é oficialmente 4716 no momento em que esta lição foi escrita. E de acordo com o calendário muçulmano, o ano é 1398. Bem-vindo ao grande mundo, meu amigo programador.
2. Criando um objeto de calendário
Usaremos o calendário gregoriano, pois é o mais comum do mundo. Pelo menos até a China comprar a Oracle e tornar o calendário chinês o principal.
Você pode criar um objeto de calendário com qualquer data usando uma instrução como esta:
Calendar date = new GregorianCalendar(year, month, day);
Sim, você tem que escrever GregorianCalendar
sempre. Em vez de Calendar
, você também pode escrever GregorianCalendar
- isso também funcionará. Mas escrever apenas Calendar
é mais curto.
O ano deve ser escrito por completo, por exemplo, você não pode escrever 19 em vez de 2019. Os meses ainda são numerados a partir do zero. Mas, como antes, os dias do mês não são numerados a partir do zero. Nerds!
Para definir a hora e a data, você precisa passar a hora como argumentos adicionais:
... = new GregorianCalendar(year, month, day, hours, minutes, seconds);
Você pode até passar em milissegundos, se necessário. Eles são o parâmetro após o número de segundos.
3. Exibindo um objeto de calendário na tela
Se você simplesmente imprimir um objeto de calendário na tela, não ficará muito satisfeito com o resultado.
Código |
---|
|
Saída do console |
|
O que você deve ter em mente aqui é que um calendário é um calendário, não uma data : ele tem todos os tipos de configurações que serão exibidas na tela.
Seria apropriado usar um SimpleDateFormat
objeto para exibir um calendário, mas até que o estudemos, você pode usar este hack de vida.
Date date = calendar.getTime();
Um Calendar
objeto pode ser facilmente convertido em um Date
objeto e você já sabe como exibir um Date
objeto. Você pode usar um código como este para converter um Calendar
objeto em Date
:
Usando o getTime()
método:
Código | Saída do console |
---|---|
|
|
Isso é uma questão bem diferente, não é?
4. Trabalhando com elementos de uma data
Para obter um elemento específico de uma data (por exemplo, ano, mês, ...), a Calendar
classe possui o get()
método. É um método único, mas possui parâmetros:
int month = calendar.get(Calendar.MONTH);
Onde calendar
é uma Calendar
variável e MONTH
é um campo constante da Calendar
classe.
Você passa um dos Calendar
campos constantes da classe como um argumento para o get
método e obtém o valor desejado como resultado.
Exemplos
Código | Descrição |
---|---|
|
era (antes ou depois da era comum) ano mês dia do mês dia da semana horas minutos segundos |
Para alterar um elemento de uma data, use o set
método:
calendar.set(Calendar.MONTH, value);
Onde calendar
é uma Calendar
variável e MONTH
é um campo constante da Calendar
classe.
Ao trabalhar com set
o método, você passa um dos Calendar
campos constantes da classe como o primeiro argumento e o novo valor como o segundo argumento.
Exemplos
Código | Descrição |
---|---|
|
ano = 2019 mês = julho (numerado a partir de 0) 4º dia horas minutos segundos |
5. Constantes da Calendar
classe
Os campos constantes da Calendar
classe não se limitam àqueles para nomear elementos de uma data. Parece haver campos para todas as ocasiões.
Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);
Por exemplo, existem campos constantes para se referir a meses:
E também os dias da semana:
Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
System.out.println("It's Friday");
}
Não vamos listar tudo. Só não queremos que você fique surpreso se vir constantes como essa no código.
O uso de constantes torna o código mais legível, e é por isso que os programadores as usam. E os meses são numerados a partir do zero também para melhorar a legibilidade. Ou não.
6. Alterar a data em um Calendar
objeto
A Calendar
classe tem um método que permite que você opere em um encontro de maneiras mais inteligentes. Por exemplo, você pode adicionar um ano, um mês ou vários dias a uma data. Ou levá-los embora. Este método é chamado add()
. Trabalhar com ele fica assim:
calendar.add(Calendar.MONTH, value);
Onde calendar
é uma Calendar
variável e MONTH
é um campo constante da Calendar
classe.
Ao trabalhar com add
o método, você passa um dos Calendar
campos constantes da classe como primeiro argumento e como segundo argumento — o novo valor a ser adicionado.
Este é outro método inteligente. Vamos ver o quão inteligente é:
Código |
---|
|
Saída do console |
|
Este método entende que fevereiro de 2019 tem apenas 28 dias, então a data resultante é 1º de março.
Agora vamos tirar 2 meses! O que devemos obter? 27 de dezembro de 2018! Vamos verificar agora.
Para realizar uma operação que resulte em uma data anterior, você precisa passar um valor negativo para o add()
método:
Código |
---|
|
Saída do console |
|
Funciona!
Este método considera as diferentes durações dos meses, bem como os anos bissextos. Em suma, um ótimo método. É exatamente o que a maioria dos programadores que trabalham com datas precisam.
7. Elementos rolantes de uma data
Mas às vezes há situações em que não queremos esse comportamento inteligente, por exemplo, você deseja fazer algo em uma parte do encontro sem alterar todo o resto.
A Calendar
classe tem o roll()
método especial para isso. Sua assinatura é igual ao add()
método, mas este método altera apenas um elemento da data, deixando o restante inalterado.
Exemplo:
Código |
---|
|
Saída do console |
|
Mudamos o mês, mas o ano e a data permaneceram inalterados.
GO TO FULL VERSION