Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Habēmus 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;
}
public boolean isMesNatal(Calendar calendar){
return calendar.get(Calendar.MONTH) == 11;
}
Por que uma nova API?
Dezembro ...
Por que uma nova API?
Calendar dataNascimento = Calendar.getInstance();
dataNascimento.set(1983, Calendar.NOVEMBER, 15);
P...
Por que uma nova API?
Calendar dataNascimento = Calendar.getInstance();
dataNascimento.set(1983, Calendar.NOVEMBER, 15);
P...
Por que uma nova API?
public class Pessoa{
private Calendar dataNascimento; // encapsulada
public Pessoa(Calendar dataNasc...
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 ...
Evolução
1996 - java.util.Date (JDK 1.0)
1997 - java.util.Calendar (JDK 1.1)
2005 - Joda-Time (third library)
2007 - JSR-3...
JSR 310
● Início oficial em 30/01/2007
● Líderes
○ Stephen Colebourne
○ Michael Nascimento Santos
○ Roger Riggs
● Baseada ...
Date Time API
JDK 1.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, Mont...
Horas
● LocalTime
○ Horários consitêm em hora, minutos e segundos
○ Horário de início do expediente, horário do
despertado...
Datas e horas
● LocalDateTime
○ Composto por data e horas
○ Data e hora de um atendimento médico, entrada de
log, marcação...
Mais modelos
● YearMonth
○ ano e mês de alistamento militar
● MonthDay
○ mês e dia de nascimento
● Year
○ ano de fabricaçã...
Mais modelos
● DayOfWeek
○ enum com os dias da semana, SUNDAY,
MONDAY..
● Month
○ enum com os meses do ano JANUARY,
FEBRUA...
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
atu...
Períodose durações
● Period
○ Montante de tempo em termos de dias, meses e
anos
■ 2 anos, 5 meses e 7 dias
● Duration
○ Mo...
Adjusters
● Usado para alterações complexas
○ ajustar uma data para o último dia do mês
○ ajustar uma data para o proximo ...
Adjusters
// 2000-10-15, domingo
LocalDate date = LocalDate.of(2000, Month.OCTOBER,
15);
// primeiro dia do mês: 2000-10-0...
Adjusters
// primeiro dia do próximo mês: 2000-11-01
date.with(TemporalAdjusters.firstDayOfNextMonth());
// primeiro dia d...
Testabilidade
● Suporte a utilização j.t.Clock controlados
○ Mocks
○ Fixos
○ Timezones específicos
● Testes independentes ...
Resumo
● LocalDate 2014-05-17
● LocalTime 15:29:33
● LocalDateTime 2014-05-17T15:29:33
● OffsetTime 15:29:33+01:00
● Offse...
Interoperabilidade
Interagindo com a API antiga
java.util java.time
Date Instant
GregorianCalendar ZonedDateTime
TimeZone ZoneId e ZoneOffset
GregorianCalendar (data padr...
Interoperabilidade
● Calendar.toInstant()
● GregorianCalendar.toZonedDateTime()
● GregorianCalendar.from(ZonedDateTime)
● ...
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
ANSI SQL Java SE 8
DATE LocalDate
TIME LocalTime
TIMESTAMP LocalDateTime
TIME WITH TIMEZONE OffsetTime
TIMESTAMP WITH TIME...
JPA
● Ainda sem suporte oficial aos novos tipos
○ https://java.net/jira/browse/JPA_SPEC-63
● Necessário criação de convers...
JPA
public class LocalDateConverter
implements AttributeConverter<LocalDate, Date>
{
@Override
public Date convertToDataba...
JPA
@Override
public Date convertToDatabaseColumn(LocalDate ld) {
if (ld == null) {
return null;
}
return new Date(ld.getY...
JPA
@Override
public LocalDate convertToEntityAttribute(Date d) {
if (d == null) {
return null;
}
return LocalDate.of(d.ge...
Backport
● Suporte ao Java 7
● Backport de funcionalidades
○ Qualidade de APIs muito superior
○ Migração para Java 8 facil...
Links
● API e tutorial oficial
○ http://docs.oracle.
com/javase/8/docs/api/java/time/package-summary.
html
○ http://docs.o...
Obrigado
@klausboeing
@mgraciano
Prochain SlideShare
Chargement dans…5
×

Finalmente java sabe trabalhar com data e hora

Finalmente java sabe trabalhar com data e hora, então vamos apresentar os principais pontos da nova API, seus pilares e como ela aborda e trata as limitações da API antiga.

  • Soyez le premier à commenter

Finalmente java sabe trabalhar com data e hora

  1. 1. Habēmus Java 8 Finalmente Java sabe trabalhar com datas e horários
  2. 2. Por que uma nova API? public boolean isMesNatal(Calendar calendar){ return calendar.get(Calendar.MONTH) == 11; }
  3. 3. public boolean isMesNatal(Calendar calendar){ return calendar.get(Calendar.MONTH) == 11; } Por que uma nova API? Dezembro == 11
  4. 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. 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. 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. 7. Por que uma nova API? long duracao = turno.getDuracao(); // horas? minutos? milisegundos?
  8. 8. Por que uma nova API? public class Turno { /** * @return duração de um turno de * trabalho em milisegundos */ public long getDuracao(){ … } }
  9. 9. Evolução 1996 - java.util.Date (JDK 1.0) 1997 - java.util.Calendar (JDK 1.1) 2005 - Joda-Time (third library) 2007 - JSR-310
  10. 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. 11. Date Time API JDK 1.8
  12. 12. Princípios fundamentais ● Imutável ● Modelo rico, compreensível e fluente ● Separação de cronologias
  13. 13. Rico modelo de dados Explorando alguns dos novos tipos de dados disponíveis
  14. 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. 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. 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. 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. 18. Mais modelos ● DayOfWeek ○ enum com os dias da semana, SUNDAY, MONDAY.. ● Month ○ enum com os 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
  19. 19. A partir do Java 8 será muito importante a escolha correta do tipo de dado baseado na necessidade de cada aplicação.
  20. 20. Formatação e Parsing ● LocalDate.now().format(...) ● LocalDate.parse(...) ● Resolve o problema de thread-safety da API atual
  21. 21. Períodose 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. 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. 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. 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. 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. 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
  27. 27. Interoperabilidade Interagindo com a API antiga
  28. 28. java.util java.time Date Instant GregorianCalendar ZonedDateTime TimeZone ZoneId e ZoneOffset GregorianCalendar (data padrão 1970-01-01) LocalTime GregorianCalendar (hora padrão 00:00) LocalDate Interoperabilidade
  29. 29. Interoperabilidade ● Calendar.toInstant() ● GregorianCalendar.toZonedDateTime() ● GregorianCalendar.from(ZonedDateTime) ● Date.from(Instant) ● Date.toInstant() ● TimeZone.toZoneId()
  30. 30. JDBC e ORM Interagindo com o banco de dados
  31. 31. JDBC ● JDBC no Java 8 suporta os novos tipos sem mudanças na API pública ● getObject e setObject
  32. 32. ANSI SQL Java SE 8 DATE LocalDate TIME LocalTime TIMESTAMP LocalDateTime TIME WITH TIMEZONE OffsetTime TIMESTAMP WITH TIMEZONE OffsetDateTime JDBC
  33. 33. JPA ● Ainda sem suporte oficial aos novos tipos ○ https://java.net/jira/browse/JPA_SPEC-63 ● Necessário criação de conversores
  34. 34. JPA public class LocalDateConverter implements AttributeConverter<LocalDate, Date> { @Override public Date convertToDatabaseColumn(LocalDate ld) { ... } @Override public LocalDate convertToEntityAttribute(Date d) { ... } }
  35. 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. 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. 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. 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
  39. 39. Obrigado @klausboeing @mgraciano

    Soyez le premier à commenter

    Identifiez-vous pour voir les commentaires

  • mgraciano

    Jun. 29, 2014
  • andersondearaujoalves

    Oct. 3, 2014
  • VERTIGOJUAN

    Apr. 13, 2015
  • Gospel001

    Sep. 27, 2016

Finalmente java sabe trabalhar com data e hora, então vamos apresentar os principais pontos da nova API, seus pilares e como ela aborda e trata as limitações da API antiga.

Vues

Nombre de vues

3 584

Sur Slideshare

0

À partir des intégrations

0

Nombre d'intégrations

51

Actions

Téléchargements

34

Partages

0

Commentaires

0

Mentions J'aime

4

×