Voeg uren toe aan een datum in Java

1. Overzicht

Voordat Java 8, java.util.Date was een van de meest gebruikte klassen voor het weergeven van datum-tijdwaarden in Java.

Toen introduceerde Java 8 java.time.LocalDateTime en java.time.ZonedDateTime. Java 8 stelt ons ook in staat om een ​​specifieke tijd op de tijdlijn weer te geven met java.time.Instant.

In deze tutorial leren we dat optellen of aftrekken n uur vanaf een bepaalde datum-tijd in Java. We zullen eerst kijken naar enkele standaard Java-datum-tijdgerelateerde klassen, en daarna zullen we enkele opties van derden laten zien.

Om meer te weten te komen over de Java 8 DateTime API, raden we u aan dit artikel te lezen.

2. java.util.Date

Als we Java 7 of lager gebruiken, kunnen we de java.util.Date en java.util.Calendar klassen voor de meeste datum-tijdgerelateerde afhandeling.

Laten we eens kijken hoe we kunnen toevoegen n uren tot een gegeven Datum voorwerp:

openbare datum addHoursToJavaUtilDate (datum datum, int uren) {Calendar calendar = Calendar.getInstance (); calendar.setTime (datum); calendar.add (Calendar.HOUR_OF_DAY, uren); return calendar.getTime (); }

Let daar op Agenda.HOUR_OF_DAY verwijst naar een 24-uurs klok.

De bovenstaande methode retourneert een nieuw Datum object, waarvan de waarde ofwel zou zijn (datum + uren) of (datum - uren), afhankelijk van of we een positieve of negatieve waarde van passeren uren respectievelijk.

Stel dat we een Java 8-applicatie hebben, maar we willen er toch mee aan de slag java.util.Date gevallen.

In een dergelijk geval kunnen we ervoor kiezen om de volgende alternatieve benadering te volgen:

  1. Gebruik java.util.DatetoInstant () methode om een Datum bezwaar maken tegen een java.time.Instant voorbeeld
  2. Voeg een specifiek Looptijd naar de java.time.Instant object met behulp van de plus() methode
  3. Herstel onze java.util.Date bijvoorbeeld door de java.time.Instant bezwaar maken tegen de java.util.Date.from () methode

Laten we deze benadering eens kort bekijken:

@Test openbare ongeldig gegevenJavaUtilDate_whenUsingToInstant_thenAddHours () {Date actualDate = nieuwe GregorianCalendar (2018, Calendar.JUNE, 25, 5, 0) .getTime (); Datum verwachte datum = nieuwe Gregoriaanse kalender (2018, Kalender.JUNE, 25, 7, 0) .getTime (); assertThat (Date.from (actualDate.toInstant (). plus (Duration.ofHours (2)))) .isEqualTo (verwachteDatum); }

Houd er echter rekening mee dat het wordt altijd aanbevolen om de nieuwe DateTime API te gebruiken voor alle applicaties op Java 8 of hogere versies.

3. java.time.LocalDateTime / ZonedDateTime

In Java 8 of hoger, uren toevoegen aan een java.time.LocalDateTime of java.time.ZonedDateTime instantie is vrij eenvoudig en maakt gebruik van de plusuren () methode:

@Test openbare ongeldig gegevenLocalDateTime_whenUsingPlusHours_thenAddHours () {LocalDateTime actualDateTime = LocalDateTime .of (2018, maand.JUNE, 25, 5, 0); LocalDateTime verwachtDateTime = LocalDateTime. van (2018, maand.JUNE, 25, 10, 0); assertThat (actualDateTime.plusHours (5)). isEqualTo (verwachteDateTime); }

Wat als we een paar uur willen aftrekken?

Een negatieve waarde van uren doorgeven aan plusuren () methode zou het prima doen. Het wordt echter aanbevolen om de minusUren () methode:

@Test openbare ongeldige gegevenLocalDateTime_whenUsingMinusHours_thenSubtractHours () {LocalDateTime actualDateTime = LocalDateTime .of (2018, maand.JUNE, 25, 5, 0); LocalDateTime verwachtDateTime = LocalDateTime .of (2018, maand.JUNE, 25, 3, 0); assertThat (actualDateTime.minusHours (2)). isEqualTo (verwachteDateTime); }

De plusuren () en minusUren () methoden in de java.time.ZonedDateTime werkt op precies dezelfde manier.

4. java.time.Instant

Zoals we weten, java.time.Instant geïntroduceerd in Java 8 DateTime API vertegenwoordigt een specifiek moment op de tijdlijn.

Om enkele uren toe te voegen aan een Onmiddellijk object, kunnen we zijn plus() methode met een java.time.temporal.TemporalAmount:

@Test openbare ongeldige gegevenInstant_whenUsingAddHoursToInstant_thenAddHours () {Instant actualValue = Instant.parse ("2018-06-25T05: 12: 35Z"); Onmiddellijk verwachteValue = Instant.parse ("2018-06-25T07: 12: 35Z"); assertThat (actualValue.plus (2, ChronoUnit.HOURS)) .isEqualTo (verwachteValue); }

Evenzo is het minus() methode kan worden gebruikt voor het aftrekken van een specifiek TemporalAmount.

5. Apache Commons DateUtils

De DateUtils klasse uit de Apache Commons Lang-bibliotheek toont een statischaddHours () methode:

public static Date addHours (Datum datum, int bedrag)

De methode neemt een java.util.Date object samen met een bedrag we willen eraan toevoegen, waarvan de waarde zowel positief als negatief kan zijn.

Een nieuw java.util.Date object wordt geretourneerd als resultaat:

@Test openbare ongeldige gegevenJavaUtilDate_whenUsingApacheCommons_thenAddHours () {Date actualDate = nieuwe GregorianCalendar (2018, Calendar.JUNE, 25, 5, 0) .getTime (); Datum verwachte datum = nieuwe Gregoriaanse kalender (2018, Calendar.JUNE, 25, 7, 0) .getTime (); assertThat (DateUtils.addHours (actualDate, 2)). isEqualTo (verwachteDatum); }

De nieuwste versie van Apache Commons Lang is verkrijgbaar bij Maven Central.

6. Joda-tijd

Joda Time is een alternatief voor de Java 8 DateTime API en biedt zijn eigen Datum Tijd implementaties.

De meeste van zijn Datum Tijd verwante klassen bloot plusuren () en minusUren () methoden om ons te helpen bij het optellen of aftrekken van een bepaald aantal uren van een Datum Tijd voorwerp.

Laten we naar een voorbeeld kijken:

@Test openbare ongeldige gegevenJodaDateTime_whenUsingPlusHoursToDateTime_thenAddHours () {DateTime actualDateTime = nieuwe DateTime (2018, 5, 25, 5, 0); DateTime verwachteDateTime = nieuwe DateTime (2018, 5, 25, 7, 0); assertThat (actualDateTime.plusHours (2)). isEqualTo (verwachteDateTime); }

We kunnen eenvoudig de nieuwste beschikbare versie van Joda-tijd bij Maven Central.

7. Conclusie

In deze zelfstudie hebben we verschillende manieren besproken om een ​​bepaald aantal uren toe te voegen aan of af te trekken van standaard Java-datum-tijdwaarden.

We hebben ook gekeken naar bibliotheken van derden als alternatief. Zoals gewoonlijk is de volledige broncode beschikbaar op GitHub.


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