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:

  1. Bruk java.util.DatetoInstant () metode for å konvertere en Dato motsette seg en java.tid. øyeblikkelig forekomst
  2. Legg til en spesifikk Varighet til java.tid. øyeblikkelig objektet ved hjelp av i tillegg til() metode
  3. 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.


$config[zx-auto] not found$config[zx-overlay] not found