1. Lambda
2. Streams
3. New Date and Time API
DateFormat nie jest wątkowo bezpieczny, jeżeli użyjemy tej samej zmiennej w dwóch wątkach możemy dostać nieokreślone wyniki.
Date i Calendar jest mutable tzn możemy zmienić zmienną w każdej chwili na inną wartość.
Nowa Data i czas od javy 8 jest immutable (nie można zmieć). Nie posiada informacji na temat stref czasowej.
Tworzenie aktuanej daty (bez czasu) wygląda następująco:

  1. LocalDate teraz = LocalDate.now();
Jest to statyczna metoda fabryki użyta do tworzenia aktualnego czasu. Możemy też utworzyć własną datę:
  1. LocalDate data = LocalDate.of(2017, 5, 27); // 2017 maj 27
  2. int rok = data.getYear(); // 2017
  3. Month miesiac = data.getMonth(); // MAY
  4. int dzien = data.getDayOfMonth(); // 27
  5. DayOfWeek dzienNazwa = data.getDayOfWeek(); // SATURDAY
  6. int dlugoscMiesiaca = data.lengthOfMonth(); // 31
  7. boolean przestepny = data.isLeapYear(); //  false
Możliwe jest też popranie wartości używając TemporalField:
  1. int rok = data.get(ChronoField.YEAR);
  2. int miesiac = data.get(ChronoField.MONTH_OF_YEAR);
  3. int dzien = data.get(ChronoField.DAY_OF_MONTH);
Możemy stworzyć datę na podstawie stringa:
  1. LocalDate data = LocalDate.parse("2017-05-27");
Kolejna klasa nowego API to czas.
  1. LocalTime czas = LocalTime.of(7,37,14); // 07:37:14
  2. int godzina = czas.getHour();
  3. int minuta = czas.getMinute();
  4. int sekunda = czas.getSecound();
Możemy stworzyć czas na podstawie stringa:
  1. LocalTime data = LocalTime.parse("07:27:14");
Do połączenia czasu i daty używamy klasy LocalDateTime:
  1. LocalDateTime dt1 = LocalDateTime.of(2017,Month.MAY, 27,14,37,7);
  2. LocalDateTime dt2 = LocalDateTime.of(data,czas);
  3. LocalDateTime dt3 = data.atTime(14,37,7);
  4. LocalDateTime dt4 = data.atTime(czas);
  5. LocalDateTime dt5 = czas.atDate(data);
możliwe jest stworzenie na podstawie klasy LocalDateTime, obiektów daty i czas:
  1. LocalDate data1 = dt1.toLocalDate();
  2. LocalTime czas1 = dt1.toLocalTime();
Klasa java.time.Instant reprezentuje maszynowy format daty: Stworzenie obiektu Instant na odstawie java.util.date:
  1. Instant instant1 = Instant.ofEpochMilli(new Date().getTime());
  2. Instant instant2 = Instant.parse("2018-10-23T11:31:15Z");
  3. Instant now     = Instant.now();
  4. Instant later   = now.plusSeconds(3);
  5. Instant earlier = now.minusSeconds(3);
Do określenia długości pomiędzy dwoma objektami daty i czasu używamy klasy Duraction:
  1. Duration godzina = Duration.ofHours(1);
  2. System.out.println(oneHours.getSeconds() + " sekund");
  3.  
  4. Duration oneHours2 = Duration.of(1, ChronoUnit.HOURS);
  5. System.out.println(oneHours2.getSeconds() + " sekund");
  6.  
  7. Duration trzyMinuty1 = Duration.ofMinutes(3);
  8. Duration trzyMinuty2 = Duration.of(3, ChronoUnit.MINUTES);
  9.  
  10. LocalDateTime oldDate = LocalDateTime.of(2017, Month.AUGUST, 22, 11, 20, 51);
  11. LocalDateTime newDate = LocalDateTime.of(2017, Month.NOVEMBER, 3, 12, 25, 54);
  12.  
  13. Duration duration = Duration.between(oldDate, newDate);
  14. System.out.println(duration.getSeconds() + " sekund");
Możliwe użycie Duraction:
  1. Duration d1 = Duration.between(localTime1, localTime2);
  2. Duration d1 = Duration.between(localDateTime1, localDateTime2);
  3. Duration d2 = Duration.between(instant1, instant2);
niemożliwe jest porównywanie LocalDate Dla LocalDate używamy klasy Period:
  1. Period okres = Period.between(LocalDate.of(2017, 4, 8),LocalDate.of(2014, 4, 22));
  2. Period dwanascieDni = Period.ofDays(12);
  3. Period trzyTygodnie = Period.ofWeeks(4);
  4. Period trzyLata5Miesiecy3dni = Period.of(3, 5, 3);
Możliwe metody do wykonania: between from of parse addTo get isNegative isZero minus multiliedBy negated plus subtractFrom Mamy możliwość na podstawie istniejących zmiennych tworzyć nowe z nowymi atrybutami:
  1. LocalDate data1 = LocalDate.of(2017, 5, 27);
  2. LocalDate data2 = data1.withYear(2018);         // 2018-05-27
  3. LocalDate data3 = data2.withDayOfMonth(14);     // 2018-05-14
  4. LocalDate data4 = data3.with(ChronoField.MONTH_OF_YEAR, 11);  // 2018-11-14
  5. LocalDate data5 = data4.plusWeeks(3);   // 2018-12-05
  6. LocalDate data6 = data5.minusYears(2);  // 2016-12-05
  7. LocalDate data7 = data6.plus(4, ChronoUnit.MONTHS);     // 2017-04-05
  8. LocalDate data8 = data7.with(java.time.temporal.
  9.                   TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); // 2017-04-09
  10. LocalDate data9 = data8.with(java.time.temporal.
  11.                   TemporalAdjusters.lastDayOfMonth()); // 2017-04-30
Możliwe tworzenie nowych dat w date-time: from now of parse atOffset atZone format get minus plus with Możliwe opcje metod java.time.temporal.TemporalAdjusters: dayOfWeekInMonth firstDayOfMonth firstDayOfNextMonth firstDayofNextYear firstDayOfYear firstInMonth lastDayOfMonth lastDayOfNextMonth lastDayOfNextYear lastDayOfYear lastInMonth nextOrSame previousOrSame Możliwe jest parsowanie dat na podstwie stringa, mamy dostepne formaty np. takie jak:
  1. Localdate data1 = LocalDate("20170527", DateTimeFormatter.BASIC_ISO_DATE);
  2. Localdate data2 = LocalDate("2017-05-27", DateTimeFormatter.ISO_LOCAL_DATE);
możemy rownież tworzyć z własnego wzorca:
  1. DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy");
  2. LocalDate date3 = LocalDate.parse("14/11/1982", format);
na podstwie takiego formatu stworzyć String:
  1. String str1 = date3.format(format); // str1 = "14/11/1982";
lub używając locale kraju:
  1. DateTimeFormatter frFormatter
  2.     = DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.FRENCH);
  3. LocalDate date1 = LocalDate.of(2017, 3, 12);
  4. String formattedDate = date1.format(frFormatter); // 12. mars 2017
  5. LocalDate date2 = LocalDate.parse(formattedDate, frFormatter);
możemy również użyć wzorca projektowego budowniczy do stworzenia formatu daty:
  1. DateTimeFormatter italianFormatter = new DateTimeFormatterBuilder()
  2. .appendText(ChronoField.DAY_OF_MONTH)
  3. .appendLiteral(". ")
  4. .appendText(ChronoField.MONTH_OF_YEAR)
  5. .appendLiteral(" ")
  6. .appendText(ChronoField.YEAR)
  7. .parseCaseInsensitive()
  8. 358
  9. .toFormatter(Locale.FRENCH);
Do operowania na strefach czasowych używamy klasy ZonedDateTime, przy czym strefe czasową definiujemy w ZoneId:
  1. ZoneId plZone = ZoneId.of("Europe/Warsaw");
  2. ZoneId zoneId = TimeZone.getDefault().toZoneId();
  3.  
  4. LocalDate date = LocalDate.of(2017, Month.MAY, 27);
  5. ZonedDateTime zdt1 = date.atStartOfDay(plZone);
  6. LocalDateTime dateTime = LocalDateTime.of(2017, Month.MAY, 27, 9, 50);
  7. ZonedDateTime zdt2 = dateTime.atZone(plZone);
  8.  
  9. Instant instant = Instant.now();
  10. ZonedDateTime zdt3 = instant.atZone(plZone);
ZonedDateTime to połaczenie = LocalDate + LocalTime + ZoneId; inny rodzaj strefy czasowej to przesunięcie o czas do obecnego czasu: Używana klasa ZoneOffset:
  1. ZoneOffset offset1 = ZoneOffset.of("-02:00");
  2. ZoneOffset offset2 = ZoneOffset.ofHoursMinutes(-2, 0);
  3. LocalDate date = LocalDate.of(1987, 5, 27);
  4. LocalTime time = LocalTime.of(5, 24, 43);
  5. OffsetDateTime attribute = OffsetDateTime.of(date, time, offset);
created by freelancer.java.org.pl © 2020