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.