2. Objetivos
1. Problemas existentes com as bibliotecas de data do Java;
2. Nova API para manipulação de datas no Java 8;
3. Códigos exemplificando.
3. API java.Date
Desde janeiro de 1996
Java 1.0
Depreciada
Mutabilidade
Integração com JDBC
Contém um instante no tempo (em ms)
Precisa implementar a lógica
Não possui operação de manipulação de datas
Sem Timezones (internacionalização)
Horário de Brasília ou de Nova York?
String com formato americano
4. API java.Date
Exemplos:
Inconsistência:
Date date = new Date(2009, 2, 1);
//Criação de uma data cujo o ano será 3909
5. API java.Calendar
Java 1.1
Ainda Mutável
Sem “Thread Safe”
Não pode formatar datas diretamente
Aritméticas de datas
Complicado, porém possível
Define localização (localTimeZone)
Algumas funções depreciadas
6. API java.Calendar
Exemplo:
Inconsistência:
Calendar calendar = new GregorianCalendar(2014, 0, 20);
// Os meses variam de 0-11 (Janeiro à Dezembro, respectivamente)
//Criando uma data: 20/01/2014
8. Exemplo - Imutabilidade
Classe String
String s = “java”;
s.toUpperCase(); // Letras maiúsculas
System.out.println(s);
9. Análise – Date e Calendar
Inconsistência
Mutabilidade
Não-padronizável
Não-formatável
Mínima manipulação
10. Joda Time
Desde 2002
API Open Source
Muito utilizada
Soluciona várias deficiências das outras bibliotecas
Imutabilidade
11. API java.Time
Imutabilidade
“Thread-Safe”
Padronizada (ISO-8601)
Novo conceito
Data para computadores
• Continuous
Data para humanos
• Human
Tipos Específicos
LocalDateTime
LocalDate
LocalTime
12. API java.Time
Exemplo:
Imutabilidade/Thread-Safe:
LocalDate hoje = LocalDate.now(); //2015-01-20
hoje.plusDays(1); // Tentando atribuir +1 ao dia
System.out.println(hoje); //2015-01-20 (ainda é hoje, e não amanhã!)
LocalDate hoje = LocalDate.now();
LocalDate amanha = hoje.plusDays(1); // somando 1 dia
boolean mesmoObjeto = hoje == amanha; //false, já que é imutável
13. Características java.Time
Baseada em padrões
ISO-8601
Imutável
LocalDate date = LocalDate.date(2009, 1, 1); // Criando
date = date.withYear(2014); // Alterando com nova invocação
Interfaces Fluentes
date = date.withYear(2014).withMonthOfYear(1).withDayOfMonth(20); // Legibilidade
Clareza
date = date.withYear(2014).withMonthOfYear(1).withDayOfMonth(20);
date = date.minusYears(2); // Resulta em 2014-01-18
Extensível
Pontos de extensão
14. Calendar versus Time
Calendar
Calendar mesQueVem = Calendar.getInstance();// Criando uma data
mesQueVem.add(Calendar.MONTH, 1); // Adicionando +1 ao mês
Time
LocalDate mesQueVem = LocalDate.now().plusMonths(1);
15. Calendar versus Time
Calendar
Calendar instante = Calendar.getInstance();
instante.set(2015, Calendar.FEBRUARY, 30);
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
System.out.println(dateFormat.format(instante.getTime()));
Saída: 02/03/15
Esperávamos um Exception.
Time
LocalDate.of(2015, Month.FEBRUARY, 30);
DateTimeException
java.time.DateTimeException: Invalid date 'FEBRUARY 30'