W JAVA, jak i w innych językach, możemy dokonywać pewnych operacji na dacie i czasie np. pobierać aktualne dane, formatować ich wyświetlanie itp.
Date i getTime
jest to klasa prosta, za pomocą której pobieramy aktualną datę i czas z dokładnością do milisekund. Więcej w dokumentacji.
Aby skorzystać z tej klasy, należy zaimportować na początku kodu odpowiednią bibliotekę: import java.util.Date;
Date date = new Date(); //w () możemy podać konkretny timestamp
System.out.println(date.toString()); //Wed May 26 20:14:21 CEST 2021
//liczba milisekund, które upłynęły od nastania Ery Unixu: 1 stycznia 1970, 0:00:00 GMT.
System.out.println(date.getTime());
SimpleDateFormat
służy do pobierania daty w preferowanym formacie, a format wyświetlania daty możemy dostosować wedle uznania, wykorzystując odpowiednie parametry (poniższa tabela pochodzi z dokumentacji):
Letter | Date or Time Component | Presentation | Examples |
---|---|---|---|
G |
Era designator | Text | AD |
y |
Year | Year | 1996 ; 96 |
Y |
Week year | Year | 2009 ; 09 |
M |
Month in year (context sensitive) | Month | July ; Jul ; 07 |
L |
Month in year (standalone form) | Month | July ; Jul ; 07 |
w |
Week in year | Number | 27 |
W |
Week in month | Number | 2 |
D |
Day in year | Number | 189 |
d |
Day in month | Number | 10 |
F |
Day of week in month | Number | 2 |
E |
Day name in week | Text | Tuesday ; Tue |
u |
Day number of week (1 = Monday, …, 7 = Sunday) | Number | 1 |
a |
Am/pm marker | Text | PM |
H |
Hour in day (0-23) | Number | 0 |
k |
Hour in day (1-24) | Number | 24 |
K |
Hour in am/pm (0-11) | Number | 0 |
h |
Hour in am/pm (1-12) | Number | 12 |
m |
Minute in hour | Number | 30 |
s |
Second in minute | Number | 55 |
S |
Millisecond | Number | 978 |
z |
Time zone | General time zone | Pacific Standard Time ; PST ; GMT-08:00 |
Z |
Time zone | RFC 822 time zone | -0800 |
X |
Time zone | ISO 8601 time zone | -08 ; -0800 ; -08:00 |
Przykłady:
Aby skorzystać z tej klasy, należy zaimportować na początku kodu odpowiednią bibliotekę:
import java.text.SimpleDateFormat;
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss 'w dniu' dd MM yyyy");
System.out.println(dateFormat.format(date));
SimpleDateFormat dateFormat1 = new SimpleDateFormat("'dzisiaj jest: 'E 'lub możemy wypisać' EEEE");
System.out.println(dateFormat1.format(date));
Calendar
to następca klasy Date, służy do odczytywania oraz modyfikowania daty i czasu w przyszłość lub przeszłość (dokumentacja).
Aby skorzystać z tej klasy, należy zaimportować na początku kodu odpowiednią bibliotekę: import java.util.Calendar;
Przykład:
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss 'w dniu' dd MM yyyy");
System.out.println(dateFormat.format(date));
//korzystamy z już zadeklarowanej zmiennej date
Calendar cal = Calendar.getInstance();
cal.setTime(date);
//za pomocą add dodajemy lub odejmujemy od aktualnego np. miesiąca wartości
cal.add(Calendar.MONTH, 6);
Date for6months = cal.getTime();
System.out.println("Przerejestrowanie działalności należy wykonać: " + for6months);
cal.add(Calendar.WEEK_OF_MONTH, 5);
Date nextVaccine = cal.getTime();
SimpleDateFormat df = new SimpleDateFormat("EEEE dd.MM.YYYY 'na godzinę' HH:mm:ss");
System.out.println("Pierwsza dawka szczepionki planowana na : " + df.format(for6months));
System.out.println("Następna dawka szczepionki: " + df.format(nextVaccine));
Na bazie tej klasy możemy wykonać bardzo dużo operacji, zainteresowanych odsyłam do dokumentacji.
//określanie dnia tygonia
//za pomocą set ustawiamy datę - uwaga na miesiąc, numeracja rozpoczyna się od 0
Calendar cal2 = GregorianCalendar.getInstance();
cal2.set(Calendar.YEAR, 2000);
cal2.set(Calendar.MONTH, 9); // numeracja miesięcy od 0
cal2.set(Calendar.DAY_OF_MONTH, 5);
cal2.set(Calendar.HOUR_OF_DAY, 2);
cal2.set(Calendar.MINUTE, 0);
cal2.set(Calendar.SECOND, 0);
Date test = cal2.getTime();
SimpleDateFormat bdf = new SimpleDateFormat("EEEE dd.MM.YYYY 'o godzinie' HH:mm:ss");
System.out.println("Urodziłam się " + bdf.format(test));
LocalTime, LocalDate i LocalDateTime
Myślenie o dacie i czasie w kontekście programowania musiało ewoluować. Proste podejście wykorzystujące typ Date przestało być wystarczające. Idąc za ciosem twórcy Javy dodali nowe klasy, które pomagają usprawnić pracę nad obsługą konkretnego momentu zdarzenia, a ten jest różny w różnych miejscach na świecie.
Tam, gdzie tylko jest to możliwe należy używać Localdate, LocalTime i LocalDateTime.
Razem z nowymi typami pojawiają się nowe pojęcia:
Instant – to konkretny punkt w czasie
LocalDate – data bez strefy czasowej.
Co mówi nam dokumentacja:
Data bez strefy czasowej w systemie kalendarza ISO-8601, na przykład 2007-12-03.
LocalDate to niezmienny obiekt daty i godziny, który reprezentuje datę, często postrzeganą jako rok-miesiąc-dzień. Można również uzyskać dostęp do innych pól dat, takich jak dzień roku, dzień tygodnia i tydzień roku. Na przykład wartość „2 października 2007” można zapisać w LocalDate.
Ta klasa nie przechowuje ani nie reprezentuje czasu ani strefy czasowej. Przedstawia opis daty. Nie może przedstawiać chwili na osi czasu bez dodatkowych informacji, takich jak przesunięcie lub strefa czasowa.
System kalendarzy ISO-8601 to nowoczesny system kalendarzy cywilnych używany obecnie w większości krajów świata. Jest to odpowiednik proleptycznego systemu kalendarza gregoriańskiego, w którym dzisiejsze zasady dotyczące lat przestępnych są stosowane przez cały czas. W przypadku większości dzisiejszych aplikacji reguły ISO-8601 są całkowicie odpowiednie. Jednak każda aplikacja, która korzysta z dat historycznych i wymaga, aby były one dokładne, uzna podejście ISO-8601 za nieodpowiednie. To jest klasa oparta na wartościach; użycie operacji wrażliwych na tożsamość (w tym równości odwołań (==), kodu skrótu tożsamości lub synchronizacji) na wystąpieniach LocalDate może mieć nieprzewidywalne wyniki i należy go unikać. Do porównań należy stosować metodę równości.
LocalTime – czas bez strefy czasowej
Co mówi nam dokumentacja:
Czas bez strefy czasowej w systemie kalendarza ISO-8601, na przykład 10:15:30.
LocalTime to niezmienny obiekt daty i godziny, który reprezentuje czas, często wyświetlany jako godzina-minuta-sekunda. Czas jest przedstawiany z dokładnością do nanosekund. Na przykład wartość „13: 45.30.123456789” może być przechowywana w LocalTime.
Ta klasa nie przechowuje ani nie reprezentuje daty ani strefy czasowej. Przedstawia opis czasu lokalnego widoczny na zegarze ściennym. Nie może przedstawiać chwili na osi czasu bez dodatkowych informacji, takich jak przesunięcie lub strefa czasowa.
System kalendarzy ISO-8601 to nowoczesny system kalendarzy cywilnych używany obecnie w większości krajów świata. Ten interfejs API zakłada, że wszystkie systemy kalendarza używają tej samej reprezentacji, tej klasy, dla pory dnia. To jest klasa oparta na wartościach; użycie operacji wrażliwych na tożsamość (w tym równości odwołań (==), kodu skrótu tożsamości lub synchronizacji) na wystąpieniach LocalTime może mieć nieprzewidywalne wyniki i należy go unikać. Do porównań należy stosować metodę równości.
LocalDateTime – data i czas bez strefy czasowej
Co mówi nam dokumentacja:
Data-godzina bez strefy czasowej w systemie kalendarza ISO-8601, na przykład 2007-12-03T10: 15: 30.
LocalDateTime to niezmienny obiekt daty i godziny, który reprezentuje datę i godzinę, często wyświetlany jako rok-miesiąc-dzień-godzina-minuta-sekunda. Można również uzyskać dostęp do innych pól daty i godziny, takich jak dzień roku, dzień tygodnia i tydzień roku. Czas jest przedstawiany z dokładnością do nanosekund. Na przykład wartość „2 października 2007 o 13: 45.30.123456789” może być przechowywana w LocalDateTime.
Ta klasa nie przechowuje ani nie reprezentuje strefy czasowej. Zamiast tego jest to opis daty używany w przypadku urodzin, w połączeniu z czasem lokalnym, jak widać na zegarze ściennym.
Nie może przedstawiać chwili na osi czasu bez dodatkowych informacji, takich jak przesunięcie lub strefa czasowa. System kalendarzy ISO-8601 to nowoczesny system kalendarzy cywilnych używany obecnie w większości krajów świata. Jest to odpowiednik proleptycznego systemu kalendarza gregoriańskiego, w którym dzisiejsze zasady dotyczące lat przestępnych są stosowane przez cały czas. W przypadku większości dzisiejszych aplikacji reguły ISO-8601 są całkowicie odpowiednie. Jednak każda aplikacja, która korzysta z dat historycznych i wymaga, aby były one dokładne, uzna podejście ISO-8601 za nieodpowiednie. To jest klasa oparta na wartościach; użycie operacji wrażliwych na tożsamość (w tym równości odwołań (==), kodu skrótu tożsamości lub synchronizacji) na wystąpieniach LocalDateTime może mieć nieprzewidywalne wyniki i należy go unikać. Do porównań należy stosować metodę równości.
ZonedDateTime – data i czas ze strefą czasową
Co mówi nam dokumentacja:
Data-czas ze strefą czasową w systemie kalendarza ISO-8601, na przykład 2007-12-03T10: 15: 30 + 01: 00 Europe / Paris.
ZonedDateTime jest niezmienną reprezentacją daty i godziny ze strefą czasową. Ta klasa przechowuje wszystkie pola daty i czasu z dokładnością do nanosekund i strefą czasową, z przesunięciem strefy używanym do obsługi niejednoznacznych lokalnych dat i godzin. Na przykład wartość „2 października 2007 o godzinie 13: 45.30.123456789 +02: 00 w strefie czasowej Europa / Paryż” może być przechowywana w ZonedDateTime.
Ta klasa obsługuje konwersję z lokalnej osi czasu LocalDateTime do natychmiastowej osi czasu Instant. Różnica między dwiema osiami czasu to przesunięcie względem czasu UTC / Greenwich, reprezentowane przez ZoneOffset. Konwersja między dwiema osiami czasu obejmuje obliczenie przesunięcia przy użyciu reguł dostępnych z ZoneId. Uzyskanie przesunięcia na chwilę jest proste, ponieważ na każdą chwilę przypada dokładnie jedno prawidłowe przesunięcie. Natomiast uzyskanie przesunięcia dla lokalnej daty i godziny nie jest proste. Istnieją trzy przypadki: Normalny, z jednym ważnym przesunięciem. Przez zdecydowaną większość roku ma zastosowanie normalny przypadek, w którym istnieje jedno ważne przesunięcie dla lokalnej daty i godziny. Luka, z zerowymi prawidłowymi przesunięciami. Dzieje się tak, gdy zegary przeskakują do przodu, zwykle z powodu wiosennej zmiany czasu letniego z „zimowego” na „letni”. W przerwie znajdują się lokalne wartości daty i godziny bez prawidłowego przesunięcia. Pokrywają się, z dwoma prawidłowymi przesunięciami. Dzieje się tak, gdy zegary są zwykle cofane z powodu zmiany czasu letniego z „lata” na „zimę”. W przypadku nakładania się istnieją lokalne wartości daty i godziny z dwoma prawidłowymi przesunięciami. Każda metoda, która konwertuje bezpośrednio lub niejawnie z lokalnej daty i godziny na chwilę przez uzyskanie przesunięcia, może być skomplikowana.
W przypadku przerw ogólną strategią jest to, że jeśli lokalna data-godzina wypada w środku przerwy, wynikowa data-czas strefowy będzie miała lokalną datę i godzinę przesuniętą do przodu o długość przerwy, co spowoduje czas w późniejszym przesunięciu, zazwyczaj czas „letni”. W przypadku nakładania się ogólna strategia polega na tym, że jeśli lokalna data i godzina przypadają w środku nakładania się, to poprzednie przesunięcie zostanie zachowane. Jeśli nie ma poprzedniego przesunięcia lub poprzednie przesunięcie jest nieprawidłowe, używane jest wcześniejsze przesunięcie, zwykle czas „letni”. Dwie dodatkowe metody, withEarlierOffsetAtOverlap () i withLaterOffsetAtOverlap (), pomagają zarządzać przypadkami nakładania się. Pod względem projektu tę klasę należy postrzegać przede wszystkim jako połączenie LocalDateTime i ZoneId. ZoneOffset jest istotną, ale drugorzędną informacją, używaną do zapewnienia, że klasa reprezentuje chwilę, szczególnie podczas nakładania się czasu letniego. To jest klasa oparta na wartościach; użycie operacji wrażliwych na tożsamość (w tym równości odwołań (==), kodu skrótu tożsamości lub synchronizacji) na wystąpieniach ZonedDateTime może mieć nieprzewidywalne wyniki i należy go unikać. Do porównań należy stosować metodę równości. Wymagania dotyczące implementacji: ZonedDateTime przechowuje stan odpowiadający trzem oddzielnym obiektom, LocalDateTime, ZoneId i rozwiązanym ZoneOffset. Przesunięcie i lokalna data-czas są używane do definiowania chwili, gdy jest to konieczne. Identyfikator strefy służy do uzyskiwania reguł określających, jak i kiedy zmienia się przesunięcie. Przesunięcia nie można dowolnie ustawiać, ponieważ strefa kontroluje, które przesunięcia są prawidłowe. Ta klasa jest niezmienna i bezpieczna dla wątków.
Aby skorzystać z tych klas, należy zaimportować na początku kodu odpowiednią bibliotekę: import java.time.*;
Przykłady:
//LocalDate
LocalDate ld = LocalDate.now();
System.out.println(ld); //2021-05-27
System.out.println(ld.getDayOfMonth()); //27
System.out.println(ld.getMonth()); //MAY
System.out.println(ld.getMonthValue()); //5
System.out.println(ld.getYear()); //2021
//dodawanie i odejmowanie
System.out.println(ld.plusDays(5)); //2021-06-01
System.out.println(ld.minusMonths(1)); //2021-04-27
//itd...
//LocalTime
LocalTime lt = LocalTime.now();
System.out.println(lt); //14:06:42.649617200
System.out.println(lt.getHour()); //14
System.out.println(lt.getMinute()); //6
System.out.println(lt.getSecond()); //42
System.out.println(lt.getNano()); //649617200
//dodawanie i odejmowanie
System.out.println(lt.plusHours(5)); //19:06:42.649617200
System.out.println(lt.minusMinutes(1)); //14:05:42.649617200
//itd...
//LocalDateTime
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt); //2021-05-27T14:23:20.115568100
//sformatujemy wyświetlanie daty kolejną klasą
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
System.out.println(dtf.format(ldt));//27-05-2021 14:23:20
//pobieramy dane
System.out.println(ldt.getDayOfMonth()); //27
System.out.println(ldt.getHour()); //14
//dodajemy i odejmujemy
System.out.println(ldt.minusYears(1));//2020-05-27T14:26:04.070597700
System.out.println(ldt.plusDays(1));//2021-05-28T14:26:04.070597700
Zadanie:
Sprawdź w jaki dzień tygodnia się urodziłeś.