Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

12. díl - Datum a čas v Javě 8 - Vytváření a formátování

Java Objektově orientované programování Datum a čas v Javě 8 - Vytváření a formátování

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, ArrayList v Javě, jsme si ukázali ArrayList. V dnešním tutoriálu se pustíme do dalších tříd, které Java poskytuje. Ukážeme si, jak se v Javě 8 pracuje s datem a časem.

Datum a čas v Javě

Implementace data a času se v Javě bohužel v minulosti hned několikrát radikálně změnila a jelikož předešlé pokusy o ni nebyly příliš uspokojiné, rozšířily se dokonce i externí knihovny, které ji nahrazují. Ačkoli vy budete používat tu nejnovější, kterou Java představila ve verzi 8, jistě se časem ve starších projektech setkáte s legacy třídami, které se k tomuto účelu využívaly v minulosti. Jsou to:

  • Date - Třída Date z balíčku java.util byla prvním pokusem o uložení data a času v Javě a nalézá se v ní již jen z důvodu zpětné kompatibility. Téměř všechny její metody jsou označené jako zastaralé a proto se s ní zde nebudeme vůbec zabývat. Pokud ji někde potkáte, bude vám muset stačit oficiální dokumentace - https://docs.oracle.com/…il/Date.html
  • Calendar - Třída Calendar je první náhradou původního Date a nově přinesla např. lokalizaci a pohodlnější manipulaci s vnitřní hodnotou, mohli jsme jednoduše přičítat časové intervaly a podobně. V nových projektech ji nepoužívejte, ale protože Java 8 je ještě poměrně nová, pravděpodobně na ni dříve či později narazíte a v tu chvíli se vám bude hodit článek Datum a čas v Javě pomocí třídy Calendar.
  • LocalDate, LocalTime a LocalDateTime - Od Javy 8 se objevila třída LocalDateTime a její varianty jen pro samotné datum a samotný čas. Oproti třídě Calendar je immutable (to zjednodušeně znamená, že s ní lze pracovat pomocí vláken, více dále v seriálu) a ctí tzv. fluent interface (někdy překládané do češtiny jako plynulé/tekoucí rozhraní), ale říkejme mu spíše řetězení metod. Také nemíchá získávání a nastavování hodnot v jedné metodě, ale poskytuje k tomuto účelu oddělené metody. Původní kalendář kvalitativně převyšuje a nahrazuje.
  • Joda-Time - Již zmíněné neúspěšné pokusy o implementaci data a času do Javy samozřejmě způsobily potřebu kvalitní náhrady a jako častá alternativa se uchytila knihovna Joda-Time. Nelze si nevšimnout, že Date API Javy 8 se touto knihovnou silně inspiruje a vychází ze stejných konceptů. Joda-Time je dost možná ještě o něco kvalitnější, ale doporučoval bych držet se spíše již poměrně kvalitní standardní třídy LocalDateTime a vyhnout se zbytečným závislostem na knihovnách třetích stran.

Velké množství tříd je, ať chceme nebo ne, každodenní chléb Java programátora. Berme to však z té pozitivní stránky, hlavně proto je tato práce asi nejlépe placená ze všech programovacích jazyků. Čekají nás celkem 3 články na toto téma. Tak vzhůru do toho!

LocalDateTime, LocalDate a LocalTime

Již víme, že budeme používat třídy LocalDateTime, LocalDate a LocalTime a to podle toho, zda potřebujeme ukládat datum i čas (např. odlet letadla), pouze datum (např. datum narození) a pouze čas (např: 12:00, přesnost na nanosekundy).

Vytvoření instancí

Začněme tím, jak lze instance jednotlivých tříd vytvořit. Vytvoříme si nový projekt s názvem DatumACas.

Vytvoření dle zadání

Když chceme vytvořit novou instanci nějaké ze tříd, zavoláme na třídě tovární metodu of() a zadáme patřičné parametry. Metoda má více přetížení, např. můžeme a nemusíme zadat vteřiny, měsíc můžeme zadat jak číslem, tak pomocí tzv. výčtového typu (což je asi přehlednější, více se o nich dozvíme dále v seriálu) a podobně.

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

Nezapomeňte jednotlivé třídy naimportovat:

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

Výstup:

Konzolová aplikace
2016-04-15T03:15
2016-04-15
03:15:10
Vytvoření dle aktuálního data a času

Ve svých aplikacích budeme samozřejmě potřebovat získat také aktuální datum a čas. K tomu slouží další tovární metoda, now(), kterou voláme opět přímo na příslušné třídě:

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

Formátování

Jelikož výstup není úplně uživatelsky přívětivý, pojďme si ukázat, jak jej naformátovat. Asi vás nepřekvapí, že k tomu použijeme metodu format(), již normálně na instanci. Samotné formátování zajišťuje třída DateTimeFormatter, nás na ni budou zajímat tyto statické metody:

  • ofLocalizedDa­teTime() - Zformátuje na lokální formát data a času. Zadáváme dva parametry - styl data a styl času. Máme na výběr plný (full) až krátký (short) formát, což platí u všech formátovacích metod kromě ofPattern().
  • ofLocalizedDate() - Zformátuje na lokální formát data
  • ofLocalizedTime() - Zformátuje na lokální formát času
  • ofPattern() - Oproti metodám výše, které formátovaly dle regionálního nastavení daného uživatele, zde můžeme specifikovat vlastní formát pomocí textového řetězce a zástupných znaků. Např. den, měsíc, rok, hodiny, minuty a sekundy (vše čísly) by se předalo jako "d.M.y H:m:ss". Popis významu všech symbolů by byl zbytečně vyčerpávající a najdete jej v oficiální dokumentaci Javy - https://docs.oracle.com/…rmatter.html

Udělejme si příklad:

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

Nezapomeňte si dodat importy:

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

Výsledek:

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

Všimněte si, že metodám specifikujeme v parametrech i již zmíněný styl (enum FormatStyle), který udává zda chceme výpis stručný až vyčerpávající. Máme k dispozici tyto hodnoty:

  • FULL - Vrací datum jako Pátek, 6. prosince 2016, pro čas nemá význam a při použití vyvolá výjimku.
  • LONG - Vrací datum jako 6. prosince 2016, pro čas nemá význam a při použití vyvolá výjimku.
  • MEDIUM - Vrací datum jako 6. pros 2016, čas jako 3:15:10.
  • SHORT - Vrací datum jako 6.12.2016, čas jako 3:15.

Na třídě DateTimeFormatter jsou také dostupné předdefinované formáty jako konstanty, ale české formáty tam nehledejte.

Jelikož datum a čas v Javě je poměrně rozsáhlé téma, budeme v něm pokračovat i v příští lekci, Datum a čas v Javě 8 - Úprava a intervaly. Ukážeme si převody mezi LocalDate, LocalTime a LocalDateTime, jak upravovat vnitřní hodnotu a také práci s intervaly.


 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
7 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Miniatura
Předchozí článek
ArrayList v Javě
Aktivity (3)

 

 

Komentáře

Avatar
Peter Gasparik:23. února 18:18

Pri formáte času mi funguje len FormatStyle.SHORT a MEDIUM, ale asi to tak ma byť, hoci, java mi nevyhubovala zato, keď som skúsil dať aj LONG a FULL (hoci popravde neviem, čo viac mi malo vyhodiť) ...ale zato to po spustení spadlo :/.

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;

public class Main {

    public static void main(String[] args) {
        // TODO code application logic here

        // Datum a cas
        LocalDateTime datumCas = LocalDateTime.now();
        //System.out.println(datumCas);
        System.out.println(datumCas.format(DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)));
        System.out.println(datumCas.format(DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM)));
        //System.out.println(datumCas.format(DateTimeFormatter.ofLocalizedTime(FormatStyle.LONG)));
        //System.out.println(datumCas.format(DateTimeFormatter.ofLocalizedTime(FormatStyle.FULL)));
}
}
Odpovědět 23. února 18:18
while (noSuccess) { tryAgain(); if (Dead) break;
Avatar
Petr Pek
Člen
Avatar
Petr Pek:3. března 17:24

omylem poslaný post

Editováno 3. března 17:27
 
Odpovědět  +1 3. března 17:24
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.