Legg til timer til en dato i Java
1. Oversikt
Før Java 8, java.util.Date var en av de mest brukte klassene for å representere dato-tidsverdier i Java.
Så introduserte Java 8 java.time.LocalDateTime og java.time.ZonedDateTime. Java 8 lar oss også representere en bestemt tid på tidslinjen ved hjelp av java.tid. øyeblikkelig.
I denne opplæringen lærer vi å legg til eller trekk fra n timer fra en gitt dato i Java. Vi ser først på noen standard Java-klokkeslettrelaterte klasser, og deretter viser vi noen tredjepartsalternativer.
For å lære mer om Java 8 DateTime API, foreslår vi at du leser denne artikkelen.
2. java.util.Date
Hvis vi bruker Java 7 eller lavere, kan vi bruke java.util.Date og java.util.Kalender klasser for mest håndtering av dato og tid.
La oss se hvordan du legger til n timer til en gitt Dato gjenstand:
public Date addHoursToJavaUtilDate (Date date, int hours) {Kalenderkalender = Calendar.getInstance (); calendar.setTime (dato); calendar.add (Calendar.HOUR_OF_DAY, timer); return kalender.getTime (); }
Noter det Kalender.HOUR_OF_DAY refererer til en 24-timers klokke.
Ovennevnte metode returnerer en ny Dato objekt, hvis verdi vil være enten (dato + timer) eller (dato - timer), avhengig av om vi passerer en positiv eller negativ verdi på timer henholdsvis.
Anta at vi har et Java 8-program, men fortsatt vil vi jobbe oss frem java.util.Date tilfeller.
I et slikt tilfelle kan vi velge følgende alternative tilnærming:
- Bruk java.util.DatetoInstant () metode for å konvertere en Dato motsette seg en java.tid. øyeblikkelig forekomst
- Legg til en spesifikk Varighet til java.tid. øyeblikkelig objektet ved hjelp av i tillegg til() metode
- Gjenopprett vår java.util.Date eksempel ved å passere i java.tid. øyeblikkelig motsette seg java.util.Date.from () metode
La oss se raskt på denne tilnærmingen:
@Test offentlig ugyldig gittJavaUtilDate_whenUsingToInstant_thenAddHours () {Date actualDate = new GregorianCalendar (2018, Calendar.JUNE, 25, 5, 0) .getTime (); Dato expectDate = ny gregoriansk kalender (2018, kalender. JUNI, 25, 7, 0) .getTime (); assertThat (Date.from (actualDate.toInstant (). plus (Duration.ofHours (2)))) .isEqualTo (expectedDate); }
Vær imidlertid oppmerksom på at det anbefales alltid å bruke den nye DateTime API for alle applikasjoner på Java 8 eller nyere versjoner.
3. java.time.LocalDateTime / ZonedDateTime
I Java 8 eller senere legger du til timer til enten a java.time.LocalDateTime eller java.time.ZonedDateTime forekomst er ganske grei og bruker plusHours () metode:
@Test offentlig ugyldig gittLocalDateTime_whenUsingPlusHours_thenAddHours () {LocalDateTime actualDateTime = LocalDateTime .of (2018, Måned. JUNI, 25, 5, 0); LocalDateTime expectDateTime = LocalDateTime. av (2018, måned. JUNI, 25, 10, 0); assertThat (actualDateTime.plusHours (5)). er EqualTo (expectDateTime); }
Hva om vi ønsker å trekke noen timer?
Gi en negativ verdi av timer til plusHours () metoden ville gjort det bra. Det anbefales imidlertid å bruke minusHours () metode:
@Test offentlig ugyldig gittLocalDateTime_whenUsingMinusHours_thenSubtractHours () {LocalDateTime actualDateTime = LocalDateTime .of (2018, måned. JUNI, 25, 5, 0); LocalDateTime expectDateTime = LocalDateTime .of (2018, måned. JUNI, 25, 3, 0); assertThat (actualDateTime.minusHours (2)). er EqualTo (expectDateTime); }
De plusHours () og minusHours () metoder i java.time.ZonedDateTime fungerer på samme måte.
4. java.tid. øyeblikkelig
Som vi vet, java.tid. øyeblikkelig introdusert i Java 8 DateTime API representerer et bestemt øyeblikk på tidslinjen.
For å legge til noen timer på en Umiddelbar objekt, kan vi bruke dens i tillegg til() metode med en java.time.temporal.TemporalAmount:
@Test offentlig ugyldig givenInstant_whenUsingAddHoursToInstant_thenAddHours () {Instant actualValue = Instant.parse ("2018-06-25T05: 12: 35Z"); Øyeblikkelig forventet verdi = Instant.parse ("2018-06-25T07: 12: 35Z"); assertThat (actualValue.plus (2, ChronoUnit.HOURS)) .isEqualTo (expectValue); }
Tilsvarende minus() metoden kan brukes til å trekke fra en spesifikk TemporalAmount.
5. Apache Commons DateUtils
De DateUtils klasse fra Apache Commons Lang-biblioteket avslører en statiskaddHours () metode:
offentlig statisk dato addHours (dato dato, int beløp)
Metoden tar inn a java.util.Date objekt sammen med en beløp vi ønsker å legge til det, hvis verdi kan være enten positiv eller negativ.
En ny java.util.Date objektet returneres som et resultat:
@Test public void givenJavaUtilDate_whenUsingApacheCommons_thenAddHours () {Date actualDate = new GregorianCalendar (2018, Calendar.JUNE, 25, 5, 0) .getTime (); Dato expectDate = ny gregoriansk kalender (2018, kalender. JUNI, 25, 7, 0) .getTime (); assertThat (DateUtils.addHours (actualDate, 2)). er EqualTo (expectDate); }
Den siste versjonen av Apache Commons Lang er tilgjengelig på Maven Central.
6. Joda Time
Joda Time er et alternativ til Java 8 DateTime API og gir sin egen Dato tid implementeringer.
Det meste av det Dato tid relaterte klasser avslører plusHours () og minusHours () metoder som hjelper oss å legge til eller trekke fra et gitt antall timer fra a Dato tid gjenstand.
La oss se på et eksempel:
@Test offentlig ugyldig gittJodaDateTime_whenUsingPlusHoursToDateTime_thenAddHours () {DateTime actualDateTime = ny DateTime (2018, 5, 25, 5, 0); DateTime expectDateTime = ny DateTime (2018, 5, 25, 7, 0); assertThat (actualDateTime.plusHours (2)). er EqualTo (expectDateTime); }
Vi kan enkelt sjekke den siste tilgjengelige versjonen av Joda Time på Maven Central.
7. Konklusjon
I denne opplæringen dekket vi flere måter å legge til eller trekke fra et gitt antall timer fra standard Java-dato-tidsverdier.
Vi så også på noen tredjepartsbiblioteker som et alternativ. Som vanlig er den komplette kildekoden tilgjengelig på GitHub.