39
Habēmus Java 8 Finalmente Java sabe trabalhar com datas e horários

Finalmente java sabe trabalhar com data e hora

Embed Size (px)

DESCRIPTION

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.

Citation preview

Page 1: Finalmente java sabe trabalhar com data e hora

Habēmus Java 8Finalmente Java sabe trabalhar com datas e horários

Page 2: Finalmente java sabe trabalhar com data e hora

Por que uma nova API?

public boolean isMesNatal(Calendar calendar){ return calendar.get(Calendar.MONTH) == 11;}

Page 3: Finalmente java sabe trabalhar com data e hora

public boolean isMesNatal(Calendar calendar){ return calendar.get(Calendar.MONTH) == 11;}

Por que uma nova API?

Dezembro == 11

Page 4: Finalmente java sabe trabalhar com data e hora

Por que uma nova API?

Calendar dataNascimento = Calendar.getInstance();dataNascimento.set(1983, Calendar.NOVEMBER, 15); Pessoa pessoa = new Pessoa(dataNascimento);

//Afirmação válidaassert pessoa.getDataNascimento() .get(Calendar.DAY_OF_MONTH) == 15;

Page 5: Finalmente java sabe trabalhar com data e hora

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álidaassert pessoa.getDataNascimento() .get(Calendar.DAY_OF_MONTH) == 15;

Calendar é mutável

Page 6: Finalmente java sabe trabalhar com data e hora

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(); } }

Page 7: Finalmente java sabe trabalhar com data e hora

Por que uma nova API?

long duracao = turno.getDuracao();// horas? minutos? milisegundos?

Page 8: Finalmente java sabe trabalhar com data e hora

Por que uma nova API?

public class Turno { /** * @return duração de um turno de * trabalho em milisegundos */ public long getDuracao(){ … }}

Page 9: Finalmente java sabe trabalhar com data e hora

Evolução1996 - java.util.Date (JDK 1.0)1997 - java.util.Calendar (JDK 1.1)2005 - Joda-Time (third library)2007 - JSR-310

Page 10: Finalmente java sabe trabalhar com data e hora

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

Page 11: Finalmente java sabe trabalhar com data e hora

Date Time APIJDK 1.8

Page 12: Finalmente java sabe trabalhar com data e hora

Princípios fundamentais

● Imutável● Modelo rico, compreensível e fluente● Separação de cronologias

Page 13: Finalmente java sabe trabalhar com data e hora

Rico modelo de dadosExplorando alguns dos novos tipos de dados disponíveis

Page 14: Finalmente java sabe trabalhar com data e hora

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);

Page 15: Finalmente java sabe trabalhar com data e hora

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);

Page 16: Finalmente java sabe trabalhar com data e hora

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);

Page 17: Finalmente java sabe trabalhar com data e hora

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

Page 18: Finalmente java sabe trabalhar com data e hora

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

● Projeto threeten-extra

Page 19: Finalmente java sabe trabalhar com data e hora

A partir do Java 8 será muito importante a escolha correta do tipo de dado baseado na necessidade de cada aplicação.

Page 20: Finalmente java sabe trabalhar com data e hora

Formatação e Parsing● LocalDate.now().format(...)● LocalDate.parse(...)

● Resolve o problema de thread-safety da API atual

Page 21: Finalmente java sabe trabalhar com data e hora

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

Page 22: Finalmente java sabe trabalhar com data e hora

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());

Page 23: Finalmente java sabe trabalhar com data e hora

Adjusters// 2000-10-15, domingoLocalDate date = LocalDate.of(2000, Month.OCTOBER, 15);

// primeiro dia do mês: 2000-10-01date.with(TemporalAdjusters.firstDayOfMonth());// Primeira segunda do mês: 2000-10-02date.with(TemporalAdjusters.firstInMonth( DayOfWeek.MONDAY));// último dia do mês: 2000-10-31date.with(TemporalAdjusters.lastDayOfMonth());

Page 24: Finalmente java sabe trabalhar com data e hora

Adjusters// primeiro dia do próximo mês: 2000-11-01date.with(TemporalAdjusters.firstDayOfNextMonth());// primeiro dia do próximo ano: 2001-01-01date.with(TemporalAdjusters.firstDayOfNextYear());// primeiro dia do ano: 2000-01-01date.with(TemporalAdjusters.firstDayOfYear());

Page 25: Finalmente java sabe trabalhar com data e hora

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

Page 26: Finalmente java sabe trabalhar com data e hora

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

Page 27: Finalmente java sabe trabalhar com data e hora

InteroperabilidadeInteragindo com a API antiga

Page 28: Finalmente java sabe trabalhar com data e hora

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

Page 29: Finalmente java sabe trabalhar com data e hora

Interoperabilidade● Calendar.toInstant()● GregorianCalendar.toZonedDateTime()● GregorianCalendar.from(ZonedDateTime)● Date.from(Instant)● Date.toInstant()● TimeZone.toZoneId()

Page 30: Finalmente java sabe trabalhar com data e hora

JDBC e ORMInteragindo com o banco de dados

Page 31: Finalmente java sabe trabalhar com data e hora

JDBC● JDBC no Java 8 suporta os novos tipos sem

mudanças na API pública● getObject e setObject

Page 32: Finalmente java sabe trabalhar com data e hora

ANSI SQL Java SE 8

DATE LocalDate

TIME LocalTime

TIMESTAMP LocalDateTime

TIME WITH TIMEZONE OffsetTime

TIMESTAMP WITH TIMEZONE OffsetDateTime

JDBC

Page 33: Finalmente java sabe trabalhar com data e hora

JPA● Ainda sem suporte oficial aos novos tipos

○ https://java.net/jira/browse/JPA_SPEC-63● Necessário criação de conversores

Page 34: Finalmente java sabe trabalhar com data e hora

JPApublic class LocalDateConverter

implements AttributeConverter<LocalDate, Date> {

@Override public Date convertToDatabaseColumn(LocalDate ld) { ... }

@Override public LocalDate convertToEntityAttribute(Date d) { ... }}

Page 35: Finalmente java sabe trabalhar com data e hora

JPA

@Overridepublic Date convertToDatabaseColumn(LocalDate ld) { if (ld == null) { return null; } return new Date(ld.getYear() - 1900,

ld.getMonthValue() - 1,

ld.getDayOfMonth());}

Page 36: Finalmente java sabe trabalhar com data e hora

JPA

@Overridepublic LocalDate convertToEntityAttribute(Date d) { if (d == null) { return null; } return LocalDate.of(d.getYear() + 1900,

d.getMonth() + 1,

d.getDate());}

Page 37: Finalmente java sabe trabalhar com data e hora

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

Page 39: Finalmente java sabe trabalhar com data e hora

Obrigado@klausboeing@mgraciano