DateFormat nie jest wielową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 aktualnej daty (bez czasu) wygląda następująco:
LocalDate teraz = LocalDate.now();
Jest to statyczna metoda fabryki użyta do tworzenia aktualnego czasu.
Możemy też utworzyć własną datę:
LocalDate data = LocalDate.of(2017, 5, 27); // 2017 maj 27
int rok = data.getYear(); // 2017
Month miesiac = data.getMonth(); // MAY
int dzien = data.getDayOfMonth(); // 27
DayOfWeek dzienNazwa = data.getDayOfWeek(); // SATURDAY
int dlugoscMiesiaca = data.lengthOfMonth(); // 31
boolean przestepny = data.isLeapYear(); // false
Możliwe jest też popranie wartości używając TemporalField:
int rok = data.get(ChronoField.YEAR);
int miesiac = data.get(ChronoField.MONTH_OF_YEAR);
int dzien = data.get(ChronoField.DAY_OF_MONTH);
Możemy stworzyć datę na podstawie stringa:
LocalDate data = LocalDate.parse("2017-05-27");
Kolejna klasa nowego API to czas.
LocalTime czas = LocalTime.of(7,37,14); // 07:37:14
int godzina = czas.getHour();
int minuta = czas.getMinute();
int sekunda = czas.getSecound();
Możemy stworzyć czas na podstawie stringa:
LocalTime data = LocalTime.parse("07:27:14");
Do połączenia czasu i daty używamy klasy LocalDateTime:
LocalDateTime dt1 = LocalDateTime.of(2017,Month.MAY, 27,14,37,7);
LocalDateTime dt2 = LocalDateTime.of(data,czas);
LocalDateTime dt3 = data.atTime(14,37,7);
LocalDateTime dt4 = data.atTime(czas);
LocalDateTime dt5 = czas.atDate(data);
możliwe jest stworzenie na podstawie klasy LocalDateTime, obiektów daty i czas:
LocalDate data1 = dt1.toLocalDate();
LocalTime czas1 = dt1.toLocalTime();
Klasa java.time.Instant reprezentuje maszynowy format daty:
Stworzenie obiektu Instant na odstawie java.util.date:
Instant instant1 = Instant.ofEpochMilli(new Date().getTime());
Instant instant2 = Instant.parse("2018-10-23T11:31:15Z");
Instant now = Instant.now();
Instant later = now.plusSeconds(3);
Instant earlier = now.minusSeconds(3);
Do określenia długości pomiędzy dwoma obiektami daty i czasu używamy klasy Duraction:
Duration godzina = Duration.ofHours(1);
System.out.println(oneHours.getSeconds() + " sekund");
Duration oneHours2 = Duration.of(1, ChronoUnit.HOURS);
System.out.println(oneHours2.getSeconds() + " sekund");
Duration trzyMinuty1 = Duration.ofMinutes(3);
Duration trzyMinuty2 = Duration.of(3, ChronoUnit.MINUTES);
LocalDateTime oldDate = LocalDateTime.of(2017, Month.AUGUST, 22, 11, 20, 51);
LocalDateTime newDate = LocalDateTime.of(2017, Month.NOVEMBER, 3, 12, 25, 54);
Duration duration = Duration.between(oldDate, newDate);
System.out.println(duration.getSeconds() + " sekund");
Możliwe użycie Duraction:
Duration d1 = Duration.between(localTime1, localTime2);
Duration d1 = Duration.between(localDateTime1, localDateTime2);
Duration d2 = Duration.between(instant1, instant2);
niemożliwe jest porównywanie LocalDate
Dla LocalDate używamy klasy Period:
Period okres = Period.between(LocalDate.of(2017, 4, 8),LocalDate.of(2014, 4, 22));
Period dwanascieDni = Period.ofDays(12);
Period trzyTygodnie = Period.ofWeeks(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:
LocalDate data1 = LocalDate.of(2017, 5, 27);
LocalDate data2 = data1.withYear(2018); // 2018-05-27
LocalDate data3 = data2.withDayOfMonth(14); // 2018-05-14
LocalDate data4 = data3.with(ChronoField.MONTH_OF_YEAR, 11); // 2018-11-14
LocalDate data5 = data4.plusWeeks(3); // 2018-12-05
LocalDate data6 = data5.minusYears(2); // 2016-12-05
LocalDate data7 = data6.plus(4, ChronoUnit.MONTHS); // 2017-04-05
LocalDate data8 = data7.with(java.time.temporal.
TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); // 2017-04-09
LocalDate data9 = data8.with(java.time.temporal.
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 podstawie stringa, mamy dostępne formaty np. takie jak:
Localdate data1 = LocalDate("20170527", DateTimeFormatter.BASIC_ISO_DATE);
Localdate data2 = LocalDate("2017-05-27", DateTimeFormatter.ISO_LOCAL_DATE);
możemy rownież tworzyć z własnego wzorca:
DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date3 = LocalDate.parse("14/11/1982", format);
na podstawie takiego formatu stworzyć String:
String str1 = date3.format(format); // str1 = "14/11/1982";
lub używając locale kraju:
DateTimeFormatter frFormatter
= DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.FRENCH);
LocalDate date1 = LocalDate.of(2017, 3, 12);
String formattedDate = date1.format(frFormatter); // 12. mars 2017
LocalDate date2 = LocalDate.parse(formattedDate, frFormatter);
możemy również użyć wzorca projektowego budowniczy do stworzenia formatu daty:
DateTimeFormatter italianFormatter = new DateTimeFormatterBuilder()
.appendText(ChronoField.DAY_OF_MONTH)
.appendLiteral(". ")
.appendText(ChronoField.MONTH_OF_YEAR)
.appendLiteral(" ")
.appendText(ChronoField.YEAR)
.parseCaseInsensitive()
358
.toFormatter(Locale.FRENCH);
Do operowania na strefach czasowych używamy klasy ZonedDateTime,
przy czym strefę czasową definiujemy w ZoneId:
ZoneId plZone = ZoneId.of("Europe/Warsaw");
ZoneId zoneId = TimeZone.getDefault().toZoneId();
LocalDate date = LocalDate.of(2017, Month.MAY, 27);
ZonedDateTime zdt1 = date.atStartOfDay(plZone);
LocalDateTime dateTime = LocalDateTime.of(2017, Month.MAY, 27, 9, 50);
ZonedDateTime zdt2 = dateTime.atZone(plZone);
Instant instant = Instant.now();
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:
ZoneOffset offset1 = ZoneOffset.of("-02:00");
ZoneOffset offset2 = ZoneOffset.ofHoursMinutes(-2, 0);
LocalDate date = LocalDate.of(1987, 5, 27);
LocalTime time = LocalTime.of(5, 24, 43);
OffsetDateTime attribute = OffsetDateTime.of(date, time, offset);
|