SlideShare a Scribd company logo
1 of 39
Download to read offline
Datas e horas no Java 8 
Finalmente Java sabe trabalhar com datas e 
horários
Por que uma nova API? 
public boolean isMesNatal(Calendar calendar){ 
return calendar.get(Calendar.MONTH) == 11; 
}
Por que uma nova API? 
public boolean isMesNatal(Calendar calendar){ 
return calendar.get(Calendar.MONTH) == 11; 
} 
Dezembro == 11
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;
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
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(); 
} 
}
Por que uma nova API? 
long duracao = turno.getDuracao(); 
// horas? minutos? milisegundos?
Por que uma nova API? 
public class Turno { 
/** 
* @return duração de um turno de 
* trabalho em milisegundos 
*/ 
public long getDuracao(){ … } 
}
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
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
Date and Time API 
Java 8
Princípios fundamentais 
● Imutável 
● Modelo rico, compreensível e fluente 
● Separação de cronologias
Rico modelo de dados 
Explorando alguns dos novos tipos de dados 
disponíveis
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);
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);
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);
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
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
A partir do Java 8 será muito 
importante a escolha correta do 
tipo de dado baseado na 
necessidade de cada aplicação.
Formatação e Parsing 
● LocalDate.now().format(...) 
● LocalDate.parse(...) 
● Resolve o problema de thread-safety da API 
atual
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
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());
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());
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());
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
Resumo 
● LocalDate 2014-05-17 
● LocalTime 15:29:33 
● LocalDateTime 2014-05-17T15:29:33 
● OffsetTime 15:29:33+01:00 
● OffsetDateTime 2014-05-17T15:29:33+01:00 
● ZonedDateTime 2014-05-17T15:29:33+01:00 
America/Sao_Paulo 
● Year 2014 
● YearMonth 2014-05 
● MonthDay 05-17 
● Instant 2343545656.534 epoch-seconds
Interoperabilidade 
Interagindo com a API antiga
java.util java.time 
Date Instant 
GregorianCalendar ZonedDateTime 
TimeZone ZoneId e ZoneOffset 
GregorianCalendar (data padrão 
LocalTime 
1970-01-01) 
GregorianCalendar (hora padrão 
00:00) 
LocalDate 
Interoperabilidade
Interoperabilidade 
● Calendar.toInstant() 
● GregorianCalendar.toZonedDateTime() 
● GregorianCalendar.from(ZonedDateTime) 
● Date.from(Instant) 
● Date.toInstant() 
● TimeZone.toZoneId()
JDBC e ORM 
Interagindo com o banco de dados
JDBC 
● JDBC no Java 8 suporta os novos tipos sem 
mudanças na API pública 
○ getObject e setObject
JDBC 
ANSI SQL Java SE 8 
DATE LocalDate 
TIME LocalTime 
TIMESTAMP LocalDateTime 
TIME WITH TIMEZONE OffsetTime 
TIMESTAMP WITH TIMEZONE OffsetDateTime
JPA 
● Ainda sem suporte oficial aos novos tipos 
○ https://java.net/jira/browse/JPA_SPEC-63 
● Necessário criação de conversores
JPA 
public class LocalDateConverter 
implements AttributeConverter<LocalDate, Date> 
{ 
@Override 
public Date convertToDatabaseColumn(LocalDate ld) { 
... 
} 
@Override 
public LocalDate convertToEntityAttribute(Date d) { 
... 
} 
}
JPA 
@Override 
public Date convertToDatabaseColumn(LocalDate ld) { 
if (ld == null) { 
return null; 
} 
return new Date(ld.getYear() - 1900, 
ld.getMonthValue() - 1, 
ld.getDayOfMonth()); 
}
JPA 
@Override 
public LocalDate convertToEntityAttribute(Date d) { 
if (d == null) { 
return null; 
} 
return LocalDate.of(d.getYear() + 1900, 
d.getMonth() + 1, 
d.getDate()); 
}
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
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
Obrigado 
@klausboeing 
@mgraciano

More Related Content

Similar to Finalmente java sabe trabalhar com data e hora (gu java sc)

Java - Bibliotecas Date, Calendar e Time
Java - Bibliotecas Date, Calendar e TimeJava - Bibliotecas Date, Calendar e Time
Java - Bibliotecas Date, Calendar e TimeJefferson Lima
 
True Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidTrue Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidVinícius Thiengo
 
agendamento de tarefas com java se e ee
agendamento de tarefas com java se e eeagendamento de tarefas com java se e ee
agendamento de tarefas com java se e eeelliando dias
 
Gestão dos prazos, custos e riscos em Gestão de Projetos
Gestão dos prazos, custos e riscos em Gestão de ProjetosGestão dos prazos, custos e riscos em Gestão de Projetos
Gestão dos prazos, custos e riscos em Gestão de ProjetosAntonio Marcos Montai Messias
 

Similar to Finalmente java sabe trabalhar com data e hora (gu java sc) (8)

Java - Bibliotecas Date, Calendar e Time
Java - Bibliotecas Date, Calendar e TimeJava - Bibliotecas Date, Calendar e Time
Java - Bibliotecas Date, Calendar e Time
 
True Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidTrue Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no Android
 
POO - 24 - Classes Básicas do Java - Datas
POO - 24 - Classes Básicas do Java - DatasPOO - 24 - Classes Básicas do Java - Datas
POO - 24 - Classes Básicas do Java - Datas
 
Spring boot
Spring bootSpring boot
Spring boot
 
Java6
Java6Java6
Java6
 
agendamento de tarefas com java se e ee
agendamento de tarefas com java se e eeagendamento de tarefas com java se e ee
agendamento de tarefas com java se e ee
 
Aula 22.pptx
Aula 22.pptxAula 22.pptx
Aula 22.pptx
 
Gestão dos prazos, custos e riscos em Gestão de Projetos
Gestão dos prazos, custos e riscos em Gestão de ProjetosGestão dos prazos, custos e riscos em Gestão de Projetos
Gestão dos prazos, custos e riscos em Gestão de Projetos
 

More from Michel Graciano

Aplicando CDI em aplicações Java
Aplicando CDI em aplicações JavaAplicando CDI em aplicações Java
Aplicando CDI em aplicações JavaMichel Graciano
 
O papel e a carreira de um desenvolvedor de software
O papel e a carreira de um desenvolvedor de softwareO papel e a carreira de um desenvolvedor de software
O papel e a carreira de um desenvolvedor de softwareMichel Graciano
 
CON6423: Scalable JavaScript applications with Project Nashorn
CON6423: Scalable JavaScript applications with Project NashornCON6423: Scalable JavaScript applications with Project Nashorn
CON6423: Scalable JavaScript applications with Project NashornMichel Graciano
 
Designing Java EE Applications in the Age of CDI
Designing Java EE Applications in the Age of CDIDesigning Java EE Applications in the Age of CDI
Designing Java EE Applications in the Age of CDIMichel Graciano
 
Introdução a CDI e como utilizá-la em aplicações reais
Introdução a CDI e como utilizá-la em aplicações reaisIntrodução a CDI e como utilizá-la em aplicações reais
Introdução a CDI e como utilizá-la em aplicações reaisMichel Graciano
 
genesis - Acelerando o desenvolvimento de aplicações desktop
genesis - Acelerando o desenvolvimento de aplicações desktopgenesis - Acelerando o desenvolvimento de aplicações desktop
genesis - Acelerando o desenvolvimento de aplicações desktopMichel Graciano
 

More from Michel Graciano (6)

Aplicando CDI em aplicações Java
Aplicando CDI em aplicações JavaAplicando CDI em aplicações Java
Aplicando CDI em aplicações Java
 
O papel e a carreira de um desenvolvedor de software
O papel e a carreira de um desenvolvedor de softwareO papel e a carreira de um desenvolvedor de software
O papel e a carreira de um desenvolvedor de software
 
CON6423: Scalable JavaScript applications with Project Nashorn
CON6423: Scalable JavaScript applications with Project NashornCON6423: Scalable JavaScript applications with Project Nashorn
CON6423: Scalable JavaScript applications with Project Nashorn
 
Designing Java EE Applications in the Age of CDI
Designing Java EE Applications in the Age of CDIDesigning Java EE Applications in the Age of CDI
Designing Java EE Applications in the Age of CDI
 
Introdução a CDI e como utilizá-la em aplicações reais
Introdução a CDI e como utilizá-la em aplicações reaisIntrodução a CDI e como utilizá-la em aplicações reais
Introdução a CDI e como utilizá-la em aplicações reais
 
genesis - Acelerando o desenvolvimento de aplicações desktop
genesis - Acelerando o desenvolvimento de aplicações desktopgenesis - Acelerando o desenvolvimento de aplicações desktop
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
  • 11. Date and Time API Java 8
  • 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
  • 26. Resumo ● LocalDate 2014-05-17 ● LocalTime 15:29:33 ● LocalDateTime 2014-05-17T15:29:33 ● OffsetTime 15:29:33+01:00 ● OffsetDateTime 2014-05-17T15:29:33+01:00 ● ZonedDateTime 2014-05-17T15:29:33+01:00 America/Sao_Paulo ● Year 2014 ● YearMonth 2014-05 ● MonthDay 05-17 ● Instant 2343545656.534 epoch-seconds
  • 28. java.util java.time Date Instant GregorianCalendar ZonedDateTime TimeZone ZoneId e ZoneOffset GregorianCalendar (data padrão LocalTime 1970-01-01) GregorianCalendar (hora padrão 00:00) LocalDate Interoperabilidade
  • 29. Interoperabilidade ● Calendar.toInstant() ● GregorianCalendar.toZonedDateTime() ● GregorianCalendar.from(ZonedDateTime) ● Date.from(Instant) ● Date.toInstant() ● TimeZone.toZoneId()
  • 30. JDBC e ORM Interagindo com o banco de dados
  • 31. JDBC ● JDBC no Java 8 suporta os novos tipos sem mudanças na API pública ○ getObject e setObject
  • 32. JDBC ANSI SQL Java SE 8 DATE LocalDate TIME LocalTime TIMESTAMP LocalDateTime TIME WITH TIMEZONE OffsetTime TIMESTAMP WITH TIMEZONE OffsetDateTime
  • 33. JPA ● Ainda sem suporte oficial aos novos tipos ○ https://java.net/jira/browse/JPA_SPEC-63 ● Necessário criação de conversores
  • 34. JPA public class LocalDateConverter implements AttributeConverter<LocalDate, Date> { @Override public Date convertToDatabaseColumn(LocalDate ld) { ... } @Override public LocalDate convertToEntityAttribute(Date d) { ... } }
  • 35. JPA @Override public Date convertToDatabaseColumn(LocalDate ld) { if (ld == null) { return null; } return new Date(ld.getYear() - 1900, ld.getMonthValue() - 1, ld.getDayOfMonth()); }
  • 36. JPA @Override public LocalDate convertToEntityAttribute(Date d) { if (d == null) { return null; } return LocalDate.of(d.getYear() + 1900, d.getMonth() + 1, d.getDate()); }
  • 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