Dohvatite datum bez vremena na Javi

1. Uvod

U ovom kratkom vodiču pokazat ćemo kako doći do a Datum bez vremena u Javi.

Pokazat ćemo kako to učiniti prije i nakon Jave 8, jer su stvari postale malo drugačije nakon izlaska novog vremenskog API-ja u Javi 8.

2. Prije Jave 8

Prije Jave 8 nije postojao izravan način za dobivanje a Datum bez vremena, osim ako nismo koristili biblioteke trećih strana poput Joda-time.

Ovo je zbog the Datum klasa u Javi predstavlja prikaz određenog trenutka u vremenu, izražen u milisekundama. Zbog toga je nemoguće zanemariti vrijeme na a Datum.

U sljedećim odjeljcima prikazat ćemo neke uobičajene zaobilazne načine za rješavanje ovog problema.

2.1. Koristeći Kalendar

Jedan od najčešćih načina za dobivanje a Datum bez vremena je da koristiti Kalendar klase za postavljanje vremena na nulu. Na taj način dobivamo čisti datum, s vremenom postavljenim na početku dana.

Pogledajmo u kodu:

javni statički datum getDateWithoutTimeUsingCalendar () {Kalendar kalendara = Calendar.getInstance (); calendar.set (Calendar.HOUR_OF_DAY, 0); calendar.set (Calendar.MINUTE, 0); calendar.set (Calendar.SECOND, 0); calendar.set (Calendar.MILLISECOND, 0); vratiti kalendar.getTime (); }

Ako nazovemo ovu metodu, dobit ćemo datum poput ovog:

Sub 23. lipnja 00:00:00 CEST 2018

Kao što vidimo, vraća puni datum s vremenom postavljenim na nulu, ali ne možemo zanemariti vrijeme.

Također, kako biste bili sigurni da u programu Datum vratio, možemo stvoriti sljedeći test:

@Test public void whenGettingDateWithoutTimeUsingCalendar_thenReturnDateWithoutTime () {Date dateWithoutTime = DateWithoutTime.getDateWithoutTimeUsingCalendar (); Kalendar kalendara = Calendar.getInstance (); calendar.setTime (dateWithoutTime); int day = calendar.get (Calendar.DAY_OF_MONTH); calendar.setTimeInMillis (dateWithoutTime.getTime () + MILLISECONDS_PER_DAY - 1); assertEquals (day, calendar.get (Calendar.DAY_OF_MONTH)); calendar.setTimeInMillis (dateWithoutTime.getTime () + MILLISECONDS_PER_DAY); assertNotEquals (dan, kalendar.get (Kalendar.DAY_OF_MONTH)); }

Kao što vidimo, kada datumu dodamo milisekunde dana minus jedan, i dalje dobivamo isti dan, ali kad dodamo cijeli dan, dobivamo sljedeći dan.

2.2. Korištenje formata

Drugi način za to je formatiranje a Datum u a Niz bez vremena, a zatim to pretvorite Niz natrag na a Datum. Budući da je Niz je formatiran bez vremena Datum pretvoreno imat će vrijeme postavljeno na nulu.

Primijenimo ga kako bismo vidjeli kako to radi:

javni statički Datum getDateWithoutTimeUsingFormat () baca ParseException {SimpleDateFormat formatter = novi SimpleDateFormat ("dd / MM / yyyy"); vrati formatter.parse (formatter.format (novi Datum ())); }

Ova implementacija vraća isto kao metoda prikazana u prethodnom odjeljku:

Sub 23. lipnja 00:00:00 CEST 2018

Opet, možemo koristiti test kao i prije kako bismo bili sigurni da nema vremena u Datum vratio.

3. Korištenje Jave 8

Objavljivanjem novog vremenskog API-ja u Javi 8 postoji lakši način za dobivanje datuma bez vremena. Jedna od novih značajki koje je ovaj novi API donio jest da postoji nekoliko klasa za rad s datumima s vremenom ili bez njega, ili čak za rad samo s vremenom.

Radi ovog članka usredotočit ćemo se na razred LocalDate, koji predstavlja upravo ono što trebamo, datum bez vremena.

Pogledajmo na ovom primjeru:

javni statični LocalDate getLocalDate () {return LocalDate.now (); }

Ova metoda vraća a LocalDate objekt s ovim datumskim prikazom:

2018-06-23

Kao što vidimo, vraća samo datum, vrijeme se potpuno zanemaruje.

Ponovno, testirajmo ga kao i prije kako bismo bili sigurni da ova metoda radi kako se očekuje:

@Test public void whenGettingLocalDate_thenReturnDateWithoutTime () {LocalDate localDate = DateWithoutTime.getLocalDate (); long millisLocalDate = localDate .atStartOfDay () .toInstant (OffsetDateTime .now () .getOffset ()) .toEpochMilli (); Kalendar kalendara = 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. Zaključak

U ovom smo članku pokazali kako doći do a Datum bez vremena u Javi. Prvo smo pokazali kako se to radi prije Java 8 i također koristeći Javu 8.

Kao što smo mogli vidjeti u primjerima provedenim u članku, pomoću Java 8 bi uvijek trebala biti preferirana opcija, budući da ima specifičan prikaz za rad s datumima bez vremena.

Kao i uvijek, puni izvorni kod primjera dostupan je na GitHub-u.


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