Tilføj timer til en dato i Java

1. Oversigt

Før Java 8, java.util.Date var en af ​​de mest anvendte klasser til at repræsentere dato-tid værdier i Java.

Derefter introducerede Java 8 java.time.LocalDateTime og java.time.ZonedDateTime. Java 8 giver os også mulighed for at repræsentere et bestemt tidspunkt på tidslinjen ved hjælp af java.tid. øjeblikkelig.

I denne vejledning lærer vi at tilføj eller træk fra n timer fra en given dato i Java. Vi ser først på nogle standard Java-dato-tidsrelaterede klasser, og derefter viser vi nogle få tredjepartsindstillinger.

For at lære mere om Java 8 DateTime API, foreslår vi at læse denne artikel.

2. java.util.Date

Hvis vi bruger Java 7 eller lavere, kan vi bruge java.util.Date og java.util.Kalender klasser til mest dato-tidsrelateret håndtering.

Lad os se, hvordan du tilføjer n timer til en given Dato objekt:

public Date addHoursToJavaUtilDate (Date date, int hours) {Kalender kalender = Calendar.getInstance (); calendar.setTime (dato); calendar.add (Calendar.HOUR_OF_DAY, timer); returner kalender.getTime (); }

Noter det Kalender.HOUR_OF_DAY henviser til et 24-timers ur.

Ovenstående metode returnerer en ny Dato objekt, hvis værdi ville være enten (dato + timer) eller (dato - timer), afhængigt af om vi passerer en positiv eller negativ værdi på timer henholdsvis.

Antag, at vi har en Java 8-applikation, men vi vil stadig arbejde vores måde med java.util.Date tilfælde.

I et sådant tilfælde kan vi vælge følgende alternative tilgang:

  1. Brug java.util.DatetoInstant () metode til at konvertere en Dato modsætter sig en java.tid. øjeblikkelig eksempel
  2. Tilføj en specifik Varighed til java.tid. øjeblikkelig objekt ved hjælp af plus() metode
  3. Gendan vores java.util.Date eksempel ved at passere i java.tid. øjeblikkelig modsætter sig java.util.Date.from () metode

Lad os se hurtigt på denne tilgang:

@Test offentlig ugyldighed givenJavaUtilDate_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 (expectDate); }

Bemærk dog det det anbefales altid at bruge den nye DateTime API til alle applikationer på Java 8 eller højere versioner.

3. java.time.LocalDateTime / ZonedDateTime

I Java 8 eller nyere tilføjes timer til enten a java.time.LocalDateTime eller java.time.ZonedDateTime eksempel er ret ligetil og gør brug af plusHours () metode:

@Test offentlig ugyldighed givenLocalDateTime_whenUsingPlusHours_thenAddHours () {LocalDateTime actualDateTime = LocalDateTime .of (2018, Måned. JUNI, 25, 5, 0); LocalDateTime expectDateTime = LocalDateTime. af (2018, måned. 25, 10, 0); assertThat (actualDateTime.plusHours (5)). er EqualTo (expectDateTime); }

Hvad hvis vi ønsker at fratrække et par timer?

At overføre en negativ værdi af timer til plusHours () metoden ville gøre det fint. Det anbefales dog at bruge minus timer () metode:

@Test offentlig ugyldighed givenLocalDateTime_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); }

Det plusHours () og minus timer () metoder i java.time.ZonedDateTime fungerer nøjagtigt på samme måde.

4. java.tid. øjeblikkelig

Som vi ved, java.tid. øjeblikkelig introduceret i Java 8 DateTime API repræsenterer et bestemt øjeblik på tidslinjen.

For at tilføje nogle timer til en Øjeblikkelig objekt, kan vi bruge dens plus() metode med en java.time.temporal.TemporalAmount:

@Test offentlig ugyldighed givenInstant_whenUsingAddHoursToInstant_thenAddHours () {Instant actualValue = Instant.parse ("2018-06-25T05: 12: 35Z"); Øjeblikkelig forventet værdi = Instant.parse ("2018-06-25T07: 12: 35Z"); assertThat (actualValue.plus (2, ChronoUnit.HOURS)) .isEqualTo (forventet værdi); }

Tilsvarende er minus() metode kan bruges til at trække et specifikt TemporalAmount.

5. Apache Commons DateUtils

Det DateUtils klasse fra Apache Commons Lang biblioteket udsætter en statiskaddHours () metode:

offentlig statisk dato addHours (dato dato, int beløb)

Metoden tager ind a java.util.Date objekt sammen med en beløb vi ønsker at tilføje det, hvis værdi enten kan være positiv eller negativ.

Et nyt java.util.Date objekt returneres som et resultat:

@Test offentlig ugyldighed 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 (forventet dato); }

Den seneste version af Apache Commons Lang fås på Maven Central.

6. Joda Time

Joda Time er et alternativ til Java 8 DateTime API og giver sin egen Dato tid implementeringer.

De fleste af dens Dato tid relaterede klasser udsætter plusHours () og minus timer () metoder til at hjælpe os med at tilføje eller trække et givet antal timer fra en Dato tid objekt.

Lad os se på et eksempel:

@Test offentlig ugyldighed givenJodaDateTime_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 nemt kontrollere den senest tilgængelige version af Joda Time ved Maven Central.

7. Konklusion

I denne vejledning dækkede vi flere måder at tilføje eller trække et givet antal timer fra standard Java-dato-tidsværdier.

Vi så også på nogle tredjepartsbiblioteker som et alternativ. Som sædvanlig er den komplette kildekode tilgængelig på GitHub.