Obțineți o dată fără timp în Java

1. Introducere

În acest scurt tutorial, vă vom arăta cum să obțineți o dată fără timp în Java.

Vom arăta cum să faceți acest lucru înainte și după Java 8, deoarece lucrurile au devenit puțin diferite după lansarea noului API de timp în Java 8.

2. Înainte de Java 8

Înainte de Java 8, nu exista o modalitate directă de a obține o dată fără timp, cu excepția cazului în care foloseam biblioteci terțe, cum ar fi Joda-time.

Acest lucru se datorează faptului că clasa Date în Java este o reprezentare a unui moment specific în timp, exprimat în milisecunde . Prin urmare, acest lucru face imposibilă ignorarea orei la o întâlnire .

În secțiunile următoare, vom arăta câteva soluții comune pentru a rezolva această problemă.

2.1. Folosind Calendar

Una dintre cele mai frecvente modalități de a obține o dată fără timp este utilizarea clasei Calendar pentru a seta ora la zero . Procedând astfel, obținem o dată curată, cu ora stabilită la începutul zilei.

Să o vedem în cod:

public static Date 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); return calendar.getTime(); }

Dacă numim această metodă, obținem o dată ca aceasta:

Sat Jun 23 00:00:00 CEST 2018

După cum putem vedea, returnează o dată completă cu ora setată la zero, dar nu putem ignora ora .

De asemenea, pentru a ne asigura că nu există timp setat în Data returnată, putem crea următorul test:

@Test public void whenGettingDateWithoutTimeUsingCalendar_thenReturnDateWithoutTime() { Date dateWithoutTime = DateWithoutTime.getDateWithoutTimeUsingCalendar(); Calendar calendar = 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(day, calendar.get(Calendar.DAY_OF_MONTH)); }

După cum putem vedea, atunci când adăugăm la dată milisecundele unei zile minus una, avem totuși aceeași zi, dar când adăugăm o zi întreagă, ajungem a doua zi.

2.2. Folosind un formatator

O altă modalitate de a face acest lucru este prin formatarea unei date într-un șir fără timp și apoi convertiți acel șir înapoi la o dată . Deoarece șirul a fost formatat fără ora, data convertită va avea ora setată la zero.

Să-l implementăm pentru a vedea cum funcționează:

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

Această implementare revine la fel ca metoda prezentată în secțiunea anterioară:

Sat Jun 23 00:00:00 CEST 2018

Din nou, putem folosi un test așa cum am făcut înainte pentru a ne asigura că nu există timp în Data returnată.

3. Utilizarea Java 8

Odată cu lansarea noii API a timpului în Java 8, există o modalitate mai ușoară de a obține o întâlnire fără oră. Una dintre noile caracteristici pe care le-a adus acest nou API este că există mai multe clase pentru a lucra cu date cu sau fără timp sau chiar pentru a lucra numai cu timpul.

De dragul acestui articol, ne vom concentra asupra clasei LocalDate , care reprezintă exact ceea ce avem nevoie, o dată fără timp.

Să vedem cu acest exemplu:

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

Această metodă returnează un obiect LocalDate cu această reprezentare a datei:

2018-06-23

După cum putem vedea, returnează doar o dată, ora este complet ignorată .

Din nou, să-l testăm ca înainte pentru a ne asigura că această metodă funcționează conform așteptărilor:

@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. Concluzie

În acest articol, am arătat cum să obțineți o dată fără timp în Java. Am arătat mai întâi cum să o facem înainte de Java 8 și, de asemenea, folosind Java 8.

Așa cum am putut vedea în exemplele implementate în articol, utilizarea Java 8 ar trebui să fie întotdeauna opțiunea preferată , deoarece are o reprezentare specifică pentru a lucra cu date fără timp.

Ca întotdeauna, codul sursă complet al exemplelor este disponibil pe GitHub.