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
- TriedaDate
z balíčkajava.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.htmlCalendar
- TriedaCalendar
je prvou náhradou pôvodnéhoDate
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
aLocalDateTime
- Od Javy 8 sa objavila triedaLocalDateTime
a jej varianty len pre samotné dátum a samotný čas. Oproti triedeCalendar
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.
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
import java.time.Month
{KOTLIN_CONSOLE}
// 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)
{/KOTLIN_CONSOLE}
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átumuofLocalizedTime()
- Formátuje na lokálne formát časuofPattern()
- 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:
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
import java.time.Month
import java.time.format.DateTimeFormatter
import java.time.format.FormatStyle
{KOTLIN_CONSOLE}
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")))
{/KOTLIN_CONSOLE}
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í.