Um passeio pelas principais novidades da nova API Date and Time do Java 8. A palestra foi apresentada no 6º encontro do JugVale em São José dos Campos. Também foi demonstrado um exemplo de uso da nova API com JPA 2.1. Código fonte em http://github.com/rsaraiva/java8labs
3. java.util.Date @since JDK1.0
System.out.println(new Date(12, 12, 12));
// Sun Jan 12 00:00:00 BRT 1913
● Que 12 se refere ao ano, mês ou dia?
● Mês 12 não é dezembro, é janeiro.
● Ano 12 não é ano 12, é 1913.
● Há um horário na data?
● Que timezone é esse?
4. java.util.Date @since JDK1.0
System.out.println(new Date(12, 12, 12));
// Sun Jan 12 00:00:00 BRT 1913
● Conceitualmente um instante
● Mutável
● Não internacionalizável
● Não UTC
● Criada no JDK 1.0 e bastante depreciada
no JDK 1.1
6. java.util.Calendar @since JDK1.1
out.println(new GregorianCalendar(12, 12, 12));
● Conceitualmente um instante
● Mutável e não thread-safe
● Não pode ser formatado, usa Date
● Não pode ser criado a partir de um Date
● Possui bugs e problemas de performance
7. Joda-Time API 2005
● 2002 – Início do projeto Joda-Time
● 2005 – Lançada versão 1.0
● 2007 – Início do desenvolvimento da JSR 310
● 2011 – Lançamento da versão 2.0
● 2014 – Finalmente, lançamento da API no
Java 8
9. JSR 310 – Date and Time API
Stephen Colebourne Michael Nascimento
A JSR 310 foi inspirada no projeto Joda-Time.
10. Calendar ultimoNatal = Calendar.getInstance();
ultimoNatal.set(Calendar.MONTH, 11);
ultimoNatal.set(Calendar.DAY_OF_MONTH, 25);
ultimoNatal.add(Calendar.YEAR, -1);
int diaUltimoNatal = ultimoNatal
.get(Calendar.DAY_OF_WEEK);
// diaUltimoNatal: 4 (1 - domingo, 2 - segunda...)
// em qual dia da semana “caiu” o
último natal?
11. 2 conceitos importantes...
1. Datas para computadores
milisegundos, nanosegundos,
instantes...
2. Datas para humanos
dia, hora, mês, dia da semana...
13. // medindo custo de execução de um método
Instant inicial = Instant.now();
meuMetodo();
Instant fim = Instant.now();
Duration duracao =
Duration.between(inicial, fim);
duracao.toMillis();
duracao.toNanos();
14. // datas para humanos - LocalDate
LocalDate hoje = LocalDate.now();
LocalDate dataDeNascimento;
● Período de 24 horas
● Dia, mês e ano
bem definidos
17. // Trabalhando com períodos
LocalDate hoje = LocalDate.now();
LocalDate d = LocalDate.of(1981, MAY, 11);
Period p = Period.between(d, hoje);
out.printf("%s anos, %s meses e %s dias",
p.getYears(), p.getMonths(), p.getDays());
// 33 anos, 0 meses e 27 dias