Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Conhecendo a Nova API Date and Time do Java 8

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

  • Be the first to comment

  • Be the first to like this

Conhecendo a Nova API Date and Time do Java 8

  1. 1. Date and Time API – Java 8
  2. 2. 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?
  3. 3. 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
  4. 4. 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=?]
  5. 5. 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
  6. 6. 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 no Java 8
  7. 7. 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!
  8. 8. JSR 310 – Date and Time API Stephen Colebourne Michael Nascimento A JSR 310 foi inspirada no projeto Joda-Time.
  9. 9. 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?
  10. 10. 2 conceitos importantes... 1. Datas para computadores milisegundos, nanosegundos, instantes... 2. Datas para humanos dia, hora, mês, dia da semana...
  11. 11. // datas para computadores Instant exatamenteAgora = Instant.now(); out.println(exatamenteAgora); // 2014-06-06T17:16:00.329Z
  12. 12. // 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();
  13. 13. // datas para humanos - LocalDate LocalDate hoje = LocalDate.now(); LocalDate dataDeNascimento; ● Período de 24 horas ● Dia, mês e ano bem definidos
  14. 14. // datas para humanos - LocalDate LocalDate finalCopaBrasil = LocalDate.of(2014, 7, 13); LocalDate finalCopaBrasil = LocalDate.of(2014, Month.JULY, 13);
  15. 15. // 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);
  16. 16. // 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
  17. 17. // 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
  18. 18. // 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);
  19. 19. // Comparando boolean eventoNoFuturo = dataEvento.isAfter(hoje); // isBefore, isEqual
  20. 20. // 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
  21. 21. // 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...
  22. 22. // 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 )
  23. 23. // 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()
  24. 24. Demo: JPA com Java 8
  25. 25. Obrigado ! Blog: rsaraiva.com Twitter: @rubenssaraiva

×