1. Klasa DateTimeFormatter

Do API Date Time dodano specjalną klasę DateTimeFormatter. Jego celem jest jak najłatwiejsze przekonwertowanie daty i godziny na dokładnie taki format, jakiego potrzebuje programista. I można powiedzieć, że twórcom Javy się to udało.

Jest bardzo łatwy w użyciu. Najpierw należy utworzyć obiekt klasy DateTimeFormatteri przekazać do niego szablon, według którego będzie wyświetlana data i godzina:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern(шаблон);

Gdzie dtf jest zmienną typu DateTimeFormatter. jest statyczną metodą klasy . A szablon jest ciągiem znaków, który określa szablon, według którego będzie wyświetlana data i godzina.DateTimeFormatter.ofPattern()DateTimeFormatter

Przykłady

Kod Wyjście na wyświetlaczu
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yy");
String text = dtf.format( LocalDateTime.now() );
System.out.println(text);


02-22-19

W powyższym przykładzie używamy metody ofPattern()do stworzenia obiektu DateTimeFormatterna podstawie ciągu szablonu. A w następnym wierszu za pomocą metody format()konwertujemy obiekt typu LocalDateTimena ciąg znaków. Widzisz wynik na ekranie.

Do metody format()można przekazać prawie każdy obiekt z interfejsu Date Time API .

Metoda statyczna ofPattern()jest również bardzo prosta: jako parametr przyjmuje ciąg szablonu i zwraca obiekt typu DateTimeFormatter. Najciekawsze jest wewnątrz szablonu.


2. Wzorzec formatowania

Ciąg przekazany jako wzorzec jest używany jako szablon podczas wyświetlania informacji. MM zastępuje się numerem miesiąca, dd dniem miesiąca, yy numerem roku. Sprawa listu ma znaczenie.

Pełna tabela konwersji czasu wygląda następująco:

List Przeznaczenie
y Rok
M Miesiąc
D Dzień dzień)
H godziny
M Minuty
S sekundy
S tysięcznych sekundy
N Nanosekundy.

Zasadniczo nie jest to trudne do zapamiętania.

I dlaczego w takim razie w szablonie z przykładu litery MM, dd i yy zostały zapisane dwukrotnie? I tutaj robi się ciekawiej.

Główny pomysł

Liczba liter wpływa na długość tekstu. Im większe litery, tym dłuższy będzie tekst.

Jeśli litera H zostanie podana raz, godzina 9 zostanie wyświetlona jako 9, a jeśli litera H zostanie podana dwa razy z rzędu, godzina 9 zostanie wyświetlona jako 09.

Jeśli litera y jest wskazana 2 razy z rzędu, to rok jest zapisywany 2 cyframi, jeśli 4 razy z rzędu - 4 cyframi.

Jeśli litera M jest wskazana 2 razy z rzędu, to zapisywany jest numer miesiąca, jeśli 3 razy z rzędu, to nazwa miesiąca (pierwsze 3 litery), jeśli 4 razy z rzędu, to pełna nazwa miesiąca.

Przykład:

Kod Wyjście na wyświetlaczu
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMMM-dd-yyyy");
String text = dtf.format( LocalDateTime.now() );
System.out.println(text);


February-22-2019


3. Pełna tabela wzorów

Pełna tabela jest dość duża i bardzo interesująca:

Próbka Wariacje wzorów Przykład Opis
y yyy, yyyy 19; 2019 Rok
M/L M, MM, MM, MMMM, MMMM 1; 01; Jan; Styczeń; J Miesiąc
D d, dd 9; 09 Dzień
H H, HH 2; 02 Oglądać
M m, mm 3; 03 minuty
S s, ss 5; 05 sekundy
S S, SS, SSS, ... 1; 12; 123 tysięcznych sekundy
N N 123456789 Nanosekundy
G G, GGGG, GGGGG OGŁOSZENIE; Anna Domini; A; Era
pytanie/pytanie q, qq, qqq, qqqq 3; 03; Q3; III kwartał Kwartał
w w 13 Tydzień w roku
W W 3 Tydzień miesiąca
mi EEEE, EEEE, EEEE poniedziałek; Poniedziałek; M Dzień tygodnia
e/c e, eee, eee, eee, eeeee 1; 01; poniedziałek; Poniedziałek; M Dzień tygodnia
A A PO POŁUDNIU Rano albo wieczorem
H H 12 Czas 1-12 godzin.
V VV Europa/Helsinki Strefa czasowa
z zzzz EET; Wschodnioeuropejski czas standardowy Strefa czasowa
O O OOOO GMT+2; GMT+02:00 Strefa czasowa

Nawiasem mówiąc, nie jest to najbardziej kompletna wersja. Najbardziej kompletny jest tutaj:

https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/time/format/DateTimeFormatter.html



4. Analiza czasu

Klasa DateTimeFormatterjest o tyle ciekawa, że ​​potrafi nie tylko przekonwertować datę i godzinę na napis według zadanego szablonu, ale także wykonać operację odwrotną!

Analizowanie i analizowanie łańcucha nazywa się parsowaniem od słowa parse .

Oto jak wygląda taki proces:

Kod Wyjście na wyświetlaczu
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMMM-dd-yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse("February-23-2019", dtf);
System.out.println(date);


February-23-2019

Najpierw tworzymy obiekt DateTimeFormatteri ustawiamy w nim szablon parsowania.

Następnie wywołujemy metodę LocalDate.parse()or LocalTime.parse()lub LocalDateTime.parse()i przekazujemy do tej metody ciąg znaków, który ma zostać przeanalizowany oraz obiekt DateTimeFormatter, który rozumie, jak i za pomocą jakiego szablonu należy przeanalizować przesłany tekst.

Inny przykład: tym razem z parsowaniem czasu.

Kod Wyjście na wyświetlaczu
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime time = LocalTime.parse("23:59:59", dtf);
System.out.println(time);


23:59:59