Upload
rubens-saraiva
View
519
Download
32
Embed Size (px)
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
Citation preview
Date and Time API – 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?
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
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=?]
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
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
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!
JSR 310 – Date and Time API
Stephen Colebourne Michael Nascimento
A JSR 310 foi inspirada no projeto Joda-Time.
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?
2 conceitos importantes...
1. Datas para computadoresmilisegundos, nanosegundos,
instantes...
2. Datas para humanosdia, hora, mês, dia da semana...
// datas para computadores Instant exatamenteAgora = Instant.now();
out.println(exatamenteAgora); // 2014-06-06T17:16:00.329Z
// 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();
// datas para humanos - LocalDate
LocalDate hoje = LocalDate.now();
LocalDate dataDeNascimento;
● Período de 24 horas
● Dia, mês e ano bem definidos
// datas para humanos - LocalDate
LocalDate finalCopaBrasil = LocalDate.of(2014, 7, 13);
LocalDate finalCopaBrasil = LocalDate.of(2014, Month.JULY, 13);
// 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);
// 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
// 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
// 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);
// Comparando
boolean eventoNoFuturo =
dataEvento.isAfter(hoje);
// isBefore, isEqual
// 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
// 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...
// 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 )
// 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()
Demo:
JPA com Java 8
Obrigado !
Blog: rsaraiva.com Twitter: @rubenssaraiva