Dodajte sate datumu u Javi

1. Pregled

Prije Jave 8, java.util.Datum bila je jedna od najčešće korištenih klasa za predstavljanje vrijednosti datuma i vremena u Javi.

Tada je predstavljena Java 8 java.time.LocalDateTime i java.time.ZonedDateTime. Java 8 također nam omogućuje predstavljanje određenog vremena na vremenskoj traci pomoću java.time.Instant.

U ovom uputstvu naučit ćemo zbrajati ili oduzimati n sati od određenog datuma i vremena na Javi. Prvo ćemo pogledati neke standardne klase Java povezane s datumom i vremenom, a zatim ćemo prikazati nekoliko opcija trećih strana.

Da biste saznali više o Java 8 DateTime API-ju, predlažemo da pročitate ovaj članak.

2. java.util.Datum

Ako koristimo Javu 7 ili stariju, možemo koristiti java.util.Datum i java.util.Kalendar klase za većinu rukovanja u vezi s datumom i vremenom.

Pogledajmo kako dodati n sati do određenog Datum objekt:

javni datum addHoursToJavaUtilDate (datum datum, int sati) {kalendar kalendara = Calendar.getInstance (); calendar.setTime (datum); calendar.add (Calendar.HOUR_OF_DAY, sati); vratiti kalendar.getTime (); }

Imajte na umu da Kalendar.HOUR_OF_DAY odnosi se na sat od 24 sata.

Gornja metoda vraća novu Datum objekt čija bi vrijednost bila bilo (datum + sati) ili (datum - sati), ovisno o tome prolazimo li pozitivnu ili negativnu vrijednost sati odnosno.

Pretpostavimo da imamo aplikaciju Java 8, ali svejedno želimo raditi na tome java.util.Datum instance.

U takvom slučaju možemo se odlučiti za sljedeći alternativni pristup:

  1. Koristiti java.util.DatumtoInstant () metoda za pretvorbu a Datum prigovoriti a java.time.Instant primjer
  2. Dodajte određeno Trajanje prema java.time.Instant objekt pomoću plus() metoda
  3. Oporavi naše java.util.Datum instancom prosljeđivanjem java.time.Instant prigovoriti na java.util.Date.from () metoda

Pogledajmo na brzinu ovaj pristup:

@Test javna praznina givenJavaUtilDate_whenUsingToInstant_thenAddHours () {Date actualDate = new GregorianCalendar (2018, Calendar.JUN, 25, 5, 0) .getTime (); Datum se očekujeDate = novi GregorianCalendar (2018, Calendar.JUN, 25, 7, 0) .getTime (); assertThat (Date.from (actualDate.toInstant (). plus (Duration.ofHours (2)))) .isEqualTo (očekuje seDatum); }

Međutim, imajte na umu da uvijek se preporučuje upotreba novog API-ja DateTime za sve programe na Javi 8 ili novijim verzijama.

3. java.time.LocalDateTime / ZonedDateTime

U Javi 8 ili novijoj, dodavanje sati bilo kojem od a java.time.LocalDateTime ili java.time.ZonedDateTime instanca prilično je jednostavna i koristi se plusHours () metoda:

@Test javna praznina givenLocalDateTime_whenUsingPlusHours_thenAddHours () {LocalDateTime actualDateTime = LocalDateTime .of (2018, Month.JUN, 25, 5, 0); LocalDateTime očekuje seDateTime = LocalDateTime. od (2018, mjesec, LIPANJ, 25, 10, 0); assertThat (actualDateTime.plusHours (5)). isEqualTo (očekuje seDateTime); }

Što ako želimo oduzeti nekoliko sati?

Prenošenje negativne vrijednosti sati na plusHours () metoda bi se učinila sasvim u redu. Međutim, preporučljivo je koristiti minusHours () metoda:

@Test javna praznina givenLocalDateTime_whenUsingMinusHours_thenSubtractHours () {LocalDateTime actualDateTime = LocalDateTime .of (2018, Month.JUN, 25, 5, 0); LocalDateTime očekuje seDateTime = LocalDateTime .of (2018, mjesec.JUN, 25, 3, 0); assertThat (actualDateTime.minusHours (2)). isEqualTo (očekuje seDateTime); }

The plusHours () i minusHours () metode u java.time.ZonedDateTime radi potpuno na isti način.

4. java.time.Instant

Kao što znamo, java.time.Instant uveden u Java 8 DateTime API predstavlja određeni trenutak na vremenskoj traci.

Da biste dodali nekoliko sati u Trenutak objekt, možemo koristiti njegov plus() metoda s a java.time.temporal.TemporalAmount:

@Test javna praznina givenInstant_whenUsingAddHoursToInstant_thenAddHours () {Instant actualValue = Instant.parse ("2018-06-25T05: 12: 35Z"); Instant očekujeValue = Instant.parse ("2018-06-25T07: 12: 35Z"); assertThat (actualValue.plus (2, ChronoUnit.HOURS)) .isEqualTo (očekuje seValue); }

Slično tome, minus() metoda može se koristiti za oduzimanje određenog TemporalAmount.

5. Apache Commons DateUtils

The DateUtils razred iz biblioteke Apache Commons Lang izlaže a statičkiaddHours () metoda:

javni statički datum addHours (datum, int iznos)

Metoda uključuje a java.util.Datum objekt zajedno s iznos želimo joj dodati, čija vrijednost može biti pozitivna ili negativna.

Nova java.util.Datum objekt se vraća kao ishod:

@Test javna praznina givenJavaUtilDate_whenUsingApacheCommons_thenAddHours () {Date actualDate = new GregorianCalendar (2018, Calendar.JUN, 25, 5, 0) .getTime (); Datum se očekujeDate = novi GregorianCalendar (2018, Calendar.JUN, 25, 7, 0) .getTime (); assertThat (DateUtils.addHours (stvarni datum, 2)). isEqualTo (očekivani datum); }

Najnovija verzija Apache Commons Lang dostupan je u Maven Central.

6. Joda Vrijeme

Joda Time je alternativa Java 8 DateTime API-ju i nudi svoj vlastiti Datum vrijeme implementacije.

Većina svojih Datum vrijeme srodni razredi izlažu plusHours () i minusHours () metode koje će nam pomoći dodati ili oduzeti zadani broj sati od a Datum vrijeme objekt.

Pogledajmo primjer:

@Test public void givenJodaDateTime_whenUsingPlusHoursToDateTime_thenAddHours () {DateTime actualDateTime = new DateTime (2018, 5, 25, 5, 0); DateTime očekujeDateTime = novo DateTime (2018, 5, 25, 7, 0); assertThat (actualDateTime.plusHours (2)). isEqualTo (očekuje seDateTime); }

Jednostavno možemo provjeriti najnoviju dostupnu verziju Joda Vrijeme u Maven Central.

7. Zaključak

U ovom smo priručniku opisali nekoliko načina za dodavanje ili oduzimanje određenog broja sati od standardnih vrijednosti Java-datuma i vremena.

Kao alternativu gledali smo i na neke biblioteke trećih strana. Kao i obično, cjeloviti izvorni kod dostupan je na GitHubu.