IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

11. diel - Dátum a čas v Kotlin - Vytváranie a formátovanie

V minulej lekcii, Vlastnosti v Kotlin , sme si vysvetlili vlastnosti. V dnešnom tutoriále sa pustíme do ďalších tried, ktoré Kotlin poskytuje pomocou Javy. Ukážeme si, ako sa v Kotlinu pracuje s dátumom a časom.

Dátum a čas v Kotlin

Kotlín nemá žiadnu vlastnú implementáciu dátumu a času. Prečo by sa tiež vývojári Kotlinu mali sústrediť na niečo, čo už vytvoril Oracle v Jave 8? Ako som zdôrazňoval v úvodnej lekcii základov Kotlinu, Kotlin a Java sú "kompatibilné", beží na rovnakom virtuálnom stroji a preto môžu zdieľať svoje triedy. Kotlín pre dátum a čas preto využíva javovské triedy.

Bohužiaľ sa v minulosti implementácie dátumu a času v Jave hneď niekoľkokrát radikálne zmenila a keďže predošlé pokusy o ňu neboli príliš uspokojivé, rozšírili sa dokonca aj externé knižnice, ktoré ju nahrádzajú. Hoci vy budete používať tú najnovšiu, ktorú Oracle predstavil vo verzii Javy 8, iste sa časom v starších projektoch stretnete s legacy triedami, ktoré sa na tento účel využívali v minulosti. Sú to:

  • Date - Trieda Date z balíčka java.util bola prvým pokusom o uložení dátumu a času v Jave a nachádza sa v nej už len z dôvodu spätnej kompatibility. Takmer všetky jej metódy sú označené ako zastarané a preto sa s ňou tu nebudeme vôbec zaoberať. Pokiaľ ju niekde stretnete, bude vám musieť stačiť oficiálnej dokumentácie - https://docs.oracle.com/...il/Date.html
  • Calendar - Trieda Calendar je prvou náhradou pôvodného Date a novo priniesla napr. Lokalizáciu a pohodlnejšiu manipuláciu s vnútornou hodnotou. Mohli sme jednoducho pripočítať časové intervaly a podobne. V nových projektoch ju nepoužívajte. Pravdepodobne na ňu skôr či neskôr narazíte a v tej chvíli sa vám bude hodiť článok, ktorý je napísaný pre Javu, Dátum a čas v Jave pomocou triedy Calendar.
  • LocalDate, LocalTime a LocalDateTime - Od Javy 8 sa objavila trieda LocalDateTime a jej varianty len pre samotné dátum a samotný čas. Oproti triede Calendar je immutable (to zjednodušene znamená, že s ňou dá pracovať pomocou vlákien, viac ďalej v kurze) a ctí tzv. Fluent interface (niekedy prekladané do slovenčiny ako plynulé / tečúca rozhranie), ale hovorme mu skôr reťazenie metód. Tiež nemieša získavanie a nastavovanie hodnôt v jednej metóde, ale poskytuje na tento účel oddelené metódy. Pôvodný kalendár kvalitatívne prevyšuje a nahradzuje.
  • Joda-Time - Už spomínané neúspešné pokusy o implementácii dátumu a času do Javy samozrejme spôsobili potrebu kvalitnej náhrady a ako častá alternatíva sa uchytila knižnica Joda-Time. Nemožno si nevšimnúť, že Date API Javy 8 sa touto knižnicou silne inšpiruje a vychádza z rovnakých konceptov. Joda-Time je dosť možno ešte o niečo kvalitnejší, ale odporúčal by som držať sa skôr už pomerne kvalitné štandardné triedy LocalDateTime a vyhnúť sa zbytočným závislostiam na knižniciach tretích strán.

Veľké množstvo tried je, či chceme alebo nie, každodenný chlieb Java / Kotlin programátora. Čakajú nás celkom 3 články na túto tému. Tak hor sa do toho!

LocalDateTime, LOCALDATE a LocalTime

Už vieme, že budeme používať triedy LocalDateTime, LocalDate a LocalTime a to podľa toho, či potrebujeme ukladať dátum a čas (napr. Odlet lietadla), len dátum (napr. Dátum narodenia) a iba čas (napr: 12:00, presnosť na nano-sekundy).

Vytvorenie inštancií

Začnime tým, ako možno inštancie jednotlivých tried vytvoriť. Vytvoríme si nový projekt s názvom DatumACas.

Vytvorenie podľa zadania

Keď chceme vytvoriť novú inštanciu nejaké z tried, zavoláme na triede továrenské metódu of() a zadáme patričné parametre. Metóda má viac preťaženie, napr. Môžeme a nemusíme zadať sekundy, mesiac môžeme zadať ako číslom, tak pomocou tzv. Vymenovaného typu (čo je asi prehľadnejšie, viac sa o nich dozvieme ďalej v kurze) a podobne.

// Datum a čas
val datumCas = LocalDateTime.of(2016, Month.APRIL, 15, 3, 15)
println(datumCas)
// Pouze datum
val datum = LocalDate.of(2016, Month.APRIL, 15)
println(datum)
// Pouze čas
val cas = LocalTime.of(3, 15, 10)
println(cas)

Nezabudnite jednotlivé triedy naimportovať:

import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
import java.time.Month

výstup:

2016-04-15T03:15
2016-04-15
03:15:10

Vytvorenie podľa aktuálneho dátumu a času

Vo svojich aplikáciách budeme samozrejme potrebovať získať aj aktuálny dátum a čas. K tomu slúži ďalšie továrenské metóda, now(), ktorú voláme opäť priamo na príslušné triede:

// Aktuální datum a čas
val datumCas = LocalDateTime.now()
println(datumCas)
// Aktuální datum
val datum = LocalDate.now()
println(datum)
// Aktuální čas
val cas = LocalTime.now()
println(cas)

Formátovanie

Keďže výstup nie je úplne užívateľsky prívetivý, poďme si ukázať, ako ho naformátovať. Asi vás neprekvapí, že na to použijeme metódu format(), už normálne na inštanciu. Samotné formátovania zaisťuje trieda DateTimeFormatter, nás na ňu budú zaujímať tieto statické metódy:

  • ofLocalizedDateTime() - Formátuje na lokálne formát dátumu a času. Zadávame dva parametre - štýl dátumu a štýl času. Máme na výber plný (full) až krátky (short) formát, čo platí u všetkých formátovacích metód okrem ofPattern ().
  • ofLocalizedDate() - Formátuje na lokálne formát dátumu
  • ofLocalizedTime() - Formátuje na lokálne formát času
  • ofPattern() - Oproti metódam vyššie, ktoré naformátovali podľa regionálneho nastavenia daného užívateľa, tu môžeme špecifikovať vlastný formát pomocou textového reťazca a zástupných znakov. Napr. deň, mesiac, rok, hodiny, minúty a sekundy (všetko číslami) by sa odovzdalo ako "DMY H: m: ss". Opis významu všetkých symbolov by bol zbytočne vyčerpávajúci a nájdete ho v oficiálnej dokumentácii Javy - https://docs.oracle.com/...rmatter.html

Urobme si príklad:

val dateTime = LocalDateTime.now()
println(dateTime.format(DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM)))
println(dateTime.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL)))
println(dateTime.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.SHORT)))
println(dateTime.format(DateTimeFormatter.ofPattern("d.M.y H:m:ss")))

Nezabudnite si dodať importy:

import java.time.format.DateTimeFormatter
import java.time.format.FormatStyle

výsledok:

20:13:04
Pátek, 9. prosince 2016
9 prosince 2016 20:13
9.12.2016 20:13:04

Dátum a čas sa bude zobrazovať lokalizovaný pre jazyk vášho operačného systému.

Všimnite si, že metódam špecifikujeme v parametroch aj už spomínaný štýl (enum FormatStyle), ktorý udáva či chceme výpis stručný až vyčerpávajúce. Máme k dispozícii tieto hodnoty:

  • FULL - Vracia dátum ako Piatok, 6. decembra 2016, pre čas nemá význam a pri použití vyvolá výnimku.
  • LONG - Vracia dátum ako 6. decembra 2016, pre čas nemá význam a pri použití vyvolá výnimku.
  • MEDIUM - Vracia dátum ako 6. pros 2016, čas ako 3:15:10.
  • SHORT - Vracia dátum ako 6.12.2016, čas ako 3:15.

Na triede DateTimeFormatter sú tiež dostupné preddefinované formáty ako konštanty, ale české formáty tam nehľadajte.

Keďže dátum a čas v Kotlinu je pomerne rozsiahle tému, budeme v ňom pokračovať aj v nasledujúcej lekcii, Kvíz - Dedičnosť, statika, vlastnosti v Kotlín OOP . Ukážeme si prevody medzi LocalDate, LocalTime a LocalDateTime, ako upravovať vnútornú hodnotu a tiež prácu s intervalmi.

V nasledujúcom kvíze, Kvíz - Dedičnosť, statika, vlastnosti v Kotlín OOP, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Predchádzajúci článok
Vlastnosti v Kotlin
Všetky články v sekcii
Objektovo orientované programovanie v Kotlin
Preskočiť článok
(neodporúčame)
Kvíz - Dedičnosť, statika, vlastnosti v Kotlín OOP
Článok pre vás napísal Samuel Kodytek
Avatar
Užívateľské hodnotenie:
1 hlasov
Autor se věnuje všem jazykům okolo JVM. Rád pomáhá lidem, kteří se zajímají o programování. Věří, že všichni mají šanci se naučit programovat, jen je potřeba prorazit tu bariéru, který se říká lenost.
Aktivity