Conhecendo a Nova API Date and Time do Java 8

26
Date and Time API – Java 8

description

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

Transcript of Conhecendo a Nova API Date and Time do Java 8

Page 1: Conhecendo a Nova API Date and Time do Java 8

Date and Time API – Java 8

Page 2: Conhecendo a Nova API Date and Time do Java 8
Page 3: Conhecendo a Nova API Date and Time do Java 8

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?

Page 4: Conhecendo a Nova API Date and Time do Java 8

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

Page 5: Conhecendo a Nova API Date and Time do Java 8

java.util.Calendar @since JDK1.1

out.println(new GregorianCalendar(12, 12, 12));

// java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/Sao_Paulo",offset=-10800000,dstSavings=3600000,useDaylight=true,transitions=129,lastRule=java.util.SimpleTimeZone[id=America/Sao_Paulo,offset=-10800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=9,startDay=15,startDayOfWeek=1,startTime=0,startTimeMode=0,endMode=3,endMonth=1,endDay=15,endDayOfWeek=1,endTime=0,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=12,MONTH=12,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

Page 6: Conhecendo a Nova API Date and Time do Java 8

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

Page 7: Conhecendo a Nova API Date and Time do Java 8

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 noJava 8

Page 8: Conhecendo a Nova API Date and Time do Java 8

Joda-Time API 2005

out.println(LocalDate.of(12, 12, 12));// 0012-12-12

● Fácil de Usar

● Design fluente

● Imutável, thread-safe

● ISO 8601 – Formato: ANO-MES-DIA

● Dezembro é 12!

Page 9: Conhecendo a Nova API Date and Time do Java 8

JSR 310 – Date and Time API

Stephen Colebourne Michael Nascimento

A JSR 310 foi inspirada no projeto Joda-Time.

Page 10: Conhecendo a Nova API Date and Time do Java 8

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?

Page 11: Conhecendo a Nova API Date and Time do Java 8

2 conceitos importantes...

1. Datas para computadoresmilisegundos, nanosegundos,

instantes...

2. Datas para humanosdia, hora, mês, dia da semana...

Page 12: Conhecendo a Nova API Date and Time do Java 8

// datas para computadores Instant exatamenteAgora = Instant.now();

out.println(exatamenteAgora); // 2014-06-06T17:16:00.329Z

Page 13: Conhecendo a Nova API Date and Time do Java 8

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

Page 14: Conhecendo a Nova API Date and Time do Java 8

// datas para humanos - LocalDate

LocalDate hoje = LocalDate.now();

LocalDate dataDeNascimento;

● Período de 24 horas

● Dia, mês e ano bem definidos

Page 15: Conhecendo a Nova API Date and Time do Java 8

// datas para humanos - LocalDate

LocalDate finalCopaBrasil = LocalDate.of(2014, 7, 13);

LocalDate finalCopaBrasil = LocalDate.of(2014, Month.JULY, 13);

Page 16: Conhecendo a Nova API Date and Time do Java 8

// LocalTime

LocalTime chegada = LocalTime.of(8, 0);LocalTime saida = LocalTime.of(18, 0);

// LocalDateTime

LocalDateTime agora = LocalDateTime.now();

LocalDateTime jogoIraNigeria =

LocalDateTime.of

(2014, JUNE, 16, 16, 0);

Page 17: Conhecendo a Nova API Date and Time do Java 8

// 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

Page 18: Conhecendo a Nova API Date and Time do Java 8

// Operações com datas

LocalDate daqui15Dias = hoje.plusDays(15);

LocalDate ontem = hoje.minusDays(1);

DayOfWeek ultimoNatal = hoje.minusYears(1)

.withMonth(DECEMBER.getValue())

.withDayOfMonth(25).getDayOfWeek();

// WEDNESDAY

Page 19: Conhecendo a Nova API Date and Time do Java 8

// Métodos at

LocalDateTime amanhaAs14 =

hoje.plusDays(1).atTime(14, 00);

Calendar c = Calendar.getInstance();

c.add(Calendar.DAY_OF_YEAR, 1);

c.set(Calendar.HOUR_OF_DAY, 14);

c.set(Calendar.MINUTE, 0);

c.set(Calendar.SECOND, 0);

Page 20: Conhecendo a Nova API Date and Time do Java 8

// Comparando

boolean eventoNoFuturo =

dataEvento.isAfter(hoje);

// isBefore, isEqual

Page 21: Conhecendo a Nova API Date and Time do Java 8

// Formatando

// antes: SimpleDateFormat (não Thread Safe)

hoje.format(DateTimeFormatter.ISO_DATE));

// 2014-05-31

hoje.format(DateTimeFormatter

.ofPattern("dd/MM/yyyy")));

// 31/05/2014

Page 22: Conhecendo a Nova API Date and Time do Java 8

// Trabalhando com fusos-horários

LocalDateTime saida = LocalDateTime

.of(2014, JUNE, 7, 10, 0);

LocalDateTime chegada = LocalDateTime

.of(2014, JUNE, 7, 18, 0);

Duration d = Duration.between(saida, chegada);

// PT8H ( 8 horas )

O relógio local marca 19:00 por causa do fuso-horário...

Page 23: Conhecendo a Nova API Date and Time do Java 8

// Trabalhando com fusos-horários

ZonedDateTime zSaida = ZonedDateTime

.of(saida, ZoneId.of("America/Sao_Paulo"));

ZonedDateTime zChegada = ZonedDateTime

.of(chegada, ZoneId.of("America/New_York"));

Duration d = Duration.between

(zSaida, zChegada);

// PT9H ( 9 horas )

Page 24: Conhecendo a Nova API Date and Time do Java 8

// Conversando com as antigas APIs

Date date = Date.from(Instant.now());

Instant instant = calendar.toInstant();

Calendar calendar = new Calendar.Builder()

.setDate(2014, Calendar.DECEMBER, 25)

.setTimeOfDay(22, 0, 0).build();

*** Date java.sql.Date.valueOf(LocalDate)

*** LocalDate java.sql.Date.toLocalDate()

Page 25: Conhecendo a Nova API Date and Time do Java 8

Demo:

JPA com Java 8

Page 26: Conhecendo a Nova API Date and Time do Java 8

Obrigado !

Blog: rsaraiva.com Twitter: @rubenssaraiva