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.


$config[zx-auto] not found$config[zx-overlay] not found