genesis - Acelerando o desenvolvimento de aplicações desktop
Finalmente java sabe trabalhar com data e hora (gu java sc)
1. Datas e horas no Java 8
Finalmente Java sabe trabalhar com datas e
horários
2. Por que uma nova API?
public boolean isMesNatal(Calendar calendar){
return calendar.get(Calendar.MONTH) == 11;
}
3. Por que uma nova API?
public boolean isMesNatal(Calendar calendar){
return calendar.get(Calendar.MONTH) == 11;
}
Dezembro == 11
4. Por que uma nova API?
Calendar dataNascimento = Calendar.getInstance();
dataNascimento.set(1983, Calendar.NOVEMBER, 15);
Pessoa pessoa = new Pessoa(dataNascimento);
//Afirmação válida
assert pessoa.getDataNascimento()
.get(Calendar.DAY_OF_MONTH) == 15;
5. Por que uma nova API?
Calendar dataNascimento = Calendar.getInstance();
dataNascimento.set(1983, Calendar.NOVEMBER, 15);
Pessoa pessoa = new Pessoa(dataNascimento);
pessoa.getDataNascimento().add(Calendar.DAY_OF_MONTH, 10);
//Afirmação inválida
assert pessoa.getDataNascimento()
.get(Calendar.DAY_OF_MONTH) == 15;
Calendar
é mutável
6. Por que uma nova API?
public class Pessoa{
private Calendar dataNascimento; // encapsulada
public Pessoa(Calendar dataNascimento){
this.dataNascimento = dataNascimento;
}
public Calendar getDataNascimento() {
return (Calendar)
this.dataNascimento.clone();
}
}
7. Por que uma nova API?
long duracao = turno.getDuracao();
// horas? minutos? milisegundos?
8. Por que uma nova API?
public class Turno {
/**
* @return duração de um turno de
* trabalho em milisegundos
*/
public long getDuracao(){ … }
}
9. Evolução
1996 - java.util.Date (JDK 1.0)
1997 - java.util.Calendar (JDK 1.1)
2005 - Joda-Time (third library)
2007 - Início JSR 310: Date and Time API
2014 - Java 8
10. JSR 310
● Início oficial em 30/01/2007
● Líderes
○ Stephen Colebourne
○ Michael Nascimento Santos
○ Roger Riggs
● Baseada fortemente no Joda Time
○ http://blog.joda.org/2009/11/why-jsr-310-isn-joda-time_
4941.html
12. Princípios fundamentais
● Imutável
● Modelo rico, compreensível e fluente
● Separação de cronologias
13. Rico modelo de dados
Explorando alguns dos novos tipos de dados
disponíveis
14. Datas
● LocalDate
○ Datas consistêm em dia, mês e ano
○ Data de nascimento, feriado, emissão de NF
LocalDate.of(2014, Month.MAY, 17);
15. Horas
● LocalTime
○ Horários consitêm em hora, minutos e segundos
○ Horário de início do expediente, horário do
despertador
LocalTime.of(13, 10);
16. Datas e horas
● LocalDateTime
○ Composto por data e horas
○ Data e hora de um atendimento médico, entrada de
log, marcação de ponto
LocalDateTime.of(2014, Month.MAY, 17, 13, 10);
17. Mais modelos
● YearMonth
○ ano e mês de alistamento militar
● MonthDay
○ mês e dia de nascimento
● Year
○ ano de fabricação de um automóvel
● Instant
○ um ponto na linha do tempo
○ remete à classe j.u.Date
18. Mais modelos
● DayOfWeek
○ enum dos dias da semana SUNDAY, MONDAY
● Month
○ enum dos meses do ano JANUARY, FEBRUARY
● ZonedDateTime
○ Time-zones são tratadas separadamente
○ Data e hora em um determinado time-zone
■ Remete à classe java.util.Calendar
● Projeto threeten-extra
19. A partir do Java 8 será muito
importante a escolha correta do
tipo de dado baseado na
necessidade de cada aplicação.
20. Formatação e Parsing
● LocalDate.now().format(...)
● LocalDate.parse(...)
● Resolve o problema de thread-safety da API
atual
21. Períodos e durações
● Period
○ Montante de tempo em termos de dias, meses e
anos
■ 2 anos, 5 meses e 7 dias
● Duration
○ Montante de tempo em termos de tempo
■ 36 segundos
■ 5 horas
■ Porém suporta o conceito de dias com 24 horas
22. Adjusters
● Usado para alterações complexas
○ ajustar uma data para o último dia do mês
○ ajustar uma data para o proximo dia útil
public interface TemporalAdjuster {
Temporal adjustInto(Temporal entrada);
}
LocalDate dataAjustada = data.with(ultimoDiaDoMes());
LocalDate dataAjustada = data.with(proximoDiaUtil());
23. Adjusters
// 2000-10-15, domingo
LocalDate date = LocalDate.of(2000, Month.OCTOBER,
15);
// primeiro dia do mês: 2000-10-01
date.with(TemporalAdjusters.firstDayOfMonth());
// Primeira segunda do mês: 2000-10-02
date.with(TemporalAdjusters.firstInMonth(
DayOfWeek.MONDAY));
// último dia do mês: 2000-10-31
date.with(TemporalAdjusters.lastDayOfMonth());
24. Adjusters
// primeiro dia do próximo mês: 2000-11-01
date.with(TemporalAdjusters.firstDayOfNextMonth());
// primeiro dia do próximo ano: 2001-01-01
date.with(TemporalAdjusters.firstDayOfNextYear());
// primeiro dia do ano: 2000-01-01
date.with(TemporalAdjusters.firstDayOfYear());
25. Testabilidade
● Suporte a utilização j.t.Clock controlados
○ Mocks
○ Fixos
○ Timezones específicos
● Testes independentes de timezone
● j.t.Clock pode ser injetado
● Trabalhar com datas e horas ficou testável
37. Backport
● Suporte ao Java 7
● Backport de funcionalidades
○ Qualidade de APIs muito superior
○ Migração para Java 8 facilitada
○ Não necessariamente de implementação
● threetenbp
○ https://github.com/ThreeTen/threetenbp
38. Links
● API e tutorial oficial
○ http://docs.oracle.
com/javase/8/docs/api/java/time/package-summary.
html
○ http://docs.oracle.com/javase/tutorial/datetime/
● Projeto threeten-extra
○ https://github.com/ThreeTen/threeten-extra
● Demos e exemplos
○ https://github.com/mgraciano/tdc-2014