Idő nélküli dátum a Java-ban

1. Bemutatkozás

Ebben a rövid bemutatóban megmutatjuk, hogyan lehet a Dátum idő nélkül a Java-ban.

Megmutatjuk, hogyan kell ezt megtenni a Java 8 előtt és után, mivel a dolgok kissé másképp alakultak a Java 8 új idő API kiadása után.

2. Java 8 előtt

A Java 8 előtt nem volt közvetlen módja a Dátum idő nélkül, hacsak nem olyan harmadik fél könyvtárakat használunk, mint a Joda-time.

Ez azért van, mert a Dátum osztály a Java-ban egy adott pillanat pillanata, milliszekundumban kifejezve. Ezért lehetetlenné teszi az a Dátum.

A következő szakaszokban bemutatunk néhány általános megoldást a probléma kezelésére.

2.1. Használata Naptár

Az egyik leggyakoribb módszer a Dátum idő nélkül az használja a Naptár osztály az idő nullára állításához. Ezzel tiszta dátumot kapunk, a nap elején beállított idővel.

Lássuk kódban:

public static Date getDateWithoutTimeUsingCalendar () {Naptár naptár = Naptár.getInstance (); calendar.set (Naptár.HOUR_OF_DAY, 0); calendar.set (Naptár.MINUTE, 0); calendar.set (Naptár.SECOND, 0); calendar.set (Naptár.MILLISECOND, 0); return calendar.getTime (); }

Ha ezt a módszert hívjuk, egy ilyen dátumot kapunk:

2018. június 23., szombat 00:00:00 CEST

Mint láthatjuk, egy teljes dátumot ad vissza, nullára állítva, de nem hagyhatjuk figyelmen kívül az időt.

Továbbá, hogy megbizonyosodjon arról, hogy nincs-e beállítva idő a Dátum visszaadva a következő tesztet hozhatjuk létre:

@Test public void whenGettingDateWithoutTimeUsingCalendar_thenReturnDateWithoutTime () {Date dateWithoutTime = DateWithoutTime.getDateWithoutTimeUsingCalendar (); Naptár naptár = Calendar.getInstance (); calendar.setTime (dateWithoutTime); int nap = naptár.get (Naptár.DAY_OF_MONTH); calendar.setTimeInMillis (dateWithoutTime.getTime () + MILLISECONDS_PER_DAY - 1); assertEquals (nap, naptár.get (Naptár.DAY_OF_MONTH)); calendar.setTimeInMillis (dateWithoutTime.getTime () + MILLISECONDS_PER_DAY); assertNotEquals (nap, naptár.get (Naptár.DAY_OF_MONTH)); }

Mint láthatjuk, amikor a dátumhoz hozzáadjuk a nap milliszekundumait, mínusz egy, akkor is ugyanazon a napon kapjuk meg, de amikor egy teljes napot adunk hozzá, másnapra.

2.2. Formázó használata

Ennek másik módja az formázás a Dátum ba be Húr idő nélkül, majd ezt konvertálja Húr vissza a Dátum. Mivel a Húr volt formázva idő nélkül a Dátum konvertálva lesz az idő nullára állítva.

Végezzük el, hogy lássuk, hogyan működik:

public static Date getDateWithoutTimeUsingFormat () dob ParseException {SimpleDateFormat formatter = new SimpleDateFormat ("dd / MM / yyyy"); return formatter.parse (formatter.format (new Date ())); }

Ez a megvalósítás ugyanazt adja vissza, mint az előző szakaszban bemutatott módszer:

2018. június 23., szombat 00:00:00 CEST

Ismét használhatunk egy tesztet, mint korábban, hogy megbizonyosodjunk arról, hogy nincs idő a Dátum visszatért.

3. A Java 8 használata

Az új idő API kiadásával a Java 8-ban egyszerűbb módja van az időpont nélküli dátum megszerzésének. Az egyik új funkció, amelyet ez az új API hozott, az, hogy több osztály foglalkozik dátumokkal idővel vagy anélkül, vagy csak idővel.

E cikk kedvéért az osztályra koncentrálunk LocalDate, amely pontosan azt ábrázolja, amire szükségünk van, egy időpont dátum nélkül.

Lássuk ezt a példát:

public static LocalDate getLocalDate () {return LocalDate.now (); }

Ez a módszer a LocalDate objektum ezzel a dátumábrázolással:

2018-06-23

Mint láthatjuk, csak egy dátumot ad vissza, az időt teljesen figyelmen kívül hagyják.

Ismét teszteljük, mint korábban, hogy megbizonyosodjunk arról, hogy ez a módszer a várt módon működik:

@Test public void whenGettingLocalDate_thenReturnDateWithoutTime () {LocalDate localDate = DateWithoutTime.getLocalDate (); long millisLocalDate = localDate .atStartOfDay () .toInstant (OffsetDateTime .now () .getOffset ()) .toEpochMilli (); Naptár naptár = Calendar.getInstance (); calendar.setTimeInMillis (millisLocalDate + MILLISECONDS_PER_DAY - 1); assertEquals (localDate.getDayOfMonth (), calendar.get (Naptár.DAY_OF_MONTH)); calendar.setTimeInMillis (millisLocalDate + MILLISECONDS_PER_DAY); assertNotEquals (localDate.getDayOfMonth (), calendar.get (Naptár.DAY_OF_MONTH)); }

4. Következtetés

Ebben a cikkben bemutattuk, hogyan lehet a Dátum idő nélkül a Java-ban. Először megmutattuk, hogyan kell csinálni a Java 8 előtt és a Java 8 használatával is.

Amint azt a cikkben megvalósított példákban láthattuk, a A Java 8 legyen mindig az előnyben részesített lehetőség, mivel sajátos reprezentációja van a dátumokkal idő nélküli munkához.

Mint mindig, a példák teljes forráskódja elérhető a GitHubon.