Získajte dátum bez času v Jave
1. Úvod
V tomto krátkom tutoriáli si ukážeme, ako získať Dátum bez času v Jave.
Ukážeme si, ako to urobiť pred a po prostredí Java 8, pretože po vydaní nového časového rozhrania API v prostredí Java 8 sa veci trochu zmenili.
2. Pred programom Java 8
Pred jazykom Java 8 neexistoval priamy spôsob, ako získať Dátum bez času, pokiaľ sme nepoužívali knižnice tretích strán ako Joda-time.
To je preto, že the Dátum trieda v Jave je reprezentácia konkrétneho času v čase, vyjadrená v milisekundách. Preto to znemožňuje ignorovať čas na a Dátum.
V ďalších častiach si ukážeme niekoľko bežných riešení, ako tento problém vyriešiť.
2.1. Použitím Kalendár
Jedným z najbežnejších spôsobov, ako získať a Dátum bez času je Použi Kalendár triedy na nastavenie času na nulu. Týmto dosiahneme čistý dátum s časom nastaveným na začiatku dňa.
Pozrime sa na to v kóde:
public static Dátum getDateWithoutTimeUsingCalendar () {Calendar calendar = Calendar.getInstance (); calendar.set (Calendar.HOUR_OF_DAY, 0); calendar.set (Calendar.MINUTE, 0); calendar.set (Calendar.SECOND, 0); calendar.set (Calendar.MILLISECOND, 0); vrátiť calendar.getTime (); }
Ak zavoláme túto metódu, dostaneme takýto dátum:
So 23. júna 00:00:00 SELČ 2018
Ako vidíme, vráti celý dátum s časom nastaveným na nulu, ale nemôžeme ignorovať čas.
Tiež sa uistite, že v Dátum vrátené, môžeme vytvoriť nasledujúci test:
@Test public void whenGettingDateWithoutTimeUsingCalendar_thenReturnDateWithoutTime () {Date dateWithoutTime = DateWithoutTime.getDateWithoutTimeUsingCalendar (); Calendar calendar = Calendar.getInstance (); calendar.setTime (dateWithoutTime); int deň = calendar.get (Calendar.DAY_OF_MONTH); calendar.setTimeInMillis (dateWithoutTime.getTime () + MILLISECONDS_PER_DAY - 1); assertEquals (deň, calendar.get (Calendar.DAY_OF_MONTH)); calendar.setTimeInMillis (dateWithoutTime.getTime () + MILLISECONDS_PER_DAY); assertNotEquals (deň, calendar.get (Calendar.DAY_OF_MONTH)); }
Ako vidíme, keď k dátumu pripočítame milisekundy dňa mínus jeden, dostaneme stále ten istý deň, ale keď k tomu pripočítame celý deň, dostaneme ďalší deň.
2.2. Používanie formátovacieho modulu
Ďalším spôsobom, ako to dosiahnuť, je formátovanie a Dátum do a String bez času a potom to previesť String späť k a Dátum. Keďže String bol naformátovaný bez času Dátum prevedený bude mať čas nastavený na nulu.
Implementujme ho, aby sme videli, ako to funguje:
public static Date getDateWithoutTimeUsingFormat () hodí ParseException {SimpleDateFormat formatter = new SimpleDateFormat ("dd / MM / rrrr"); návrat formatter.parse (formatter.format (nový dátum ())); }
Táto implementácia sa vracia rovnako ako metóda uvedená v predchádzajúcej časti:
So 23. júna 00:00:00 SELČ 2018
Opäť môžeme použiť test ako predtým, aby sme sa uistili, že na ňom nie je čas Dátum vrátený.
3. Používanie Java 8
S vydaním nového časového rozhrania API v prostredí Java 8 existuje jednoduchší spôsob, ako získať dátum bez času. Jednou z nových funkcií, ktoré toto nové API prinieslo, je, že existuje niekoľko tried na prácu s dátumami s časom alebo bez času alebo dokonca na prácu iba s časom.
V rámci tohto článku sa zameriame na triedu LocalDate, čo predstavuje presne to, čo potrebujeme, dátum bez času.
Pozrime sa na tento príklad:
public static LocalDate getLocalDate () {return LocalDate.now (); }
Táto metóda vracia a LocalDate objekt s týmto znázornením dátumu:
2018-06-23
Ako vidíme, vráti iba dátum, čas je úplne ignorovaný.
Opäť to otestujme ako predtým, aby sme sa uistili, že táto metóda funguje podľa očakávania:
@Test public void whenGettingLocalDate_thenReturnDateWithoutTime () {LocalDate localDate = DateWithoutTime.getLocalDate (); long millisLocalDate = localDate .atStartOfDay () .toInstant (OffsetDateTime .now () .getOffset ()) .toEpochMilli (); Calendar calendar = Calendar.getInstance (); calendar.setTimeInMillis (millisLocalDate + MILLISECONDS_PER_DAY - 1); assertEquals (localDate.getDayOfMonth (), calendar.get (Calendar.DAY_OF_MONTH)); calendar.setTimeInMillis (millisLocalDate + MILLISECONDS_PER_DAY); assertNotEquals (localDate.getDayOfMonth (), calendar.get (Calendar.DAY_OF_MONTH)); }
4. Záver
V tomto článku sme si ukázali, ako získať a Dátum bez času v Jave. Najprv sme si ukázali, ako to urobiť pred jazykom Java 8 a tiež s použitím jazyka Java 8.
Ako sme mohli vidieť v príkladoch implementovaných v článku, pomocou Java 8 by mala byť vždy preferovanou voľbou, pretože má špecifické zastúpenie pre prácu s dátumami bez času.
Celý zdrojový kód príkladov je ako vždy k dispozícii na serveri GitHub.