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:
- Koristiti java.util.DatumtoInstant () metoda za pretvorbu a Datum prigovoriti a java.time.Instant primjer
- Dodajte određeno Trajanje prema java.time.Instant objekt pomoću plus() metoda
- 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.