Pridajte hodiny k dátumu v Jave

1. Prehľad

Pred programom Java 8, java.util.Date bola jednou z najbežnejšie používaných tried na reprezentáciu hodnôt času a času v Jave.

Potom bola predstavená Java 8 java.time.LocalDateTime a java.time.ZonedDateTime. Java 8 nám tiež umožňuje reprezentovať konkrétny čas na časovej osi pomocou java.time.Instant.

V tejto príručke sa naučíme sčítať alebo odčítať n hodín od daného dátumu a času v Jave. Najprv sa pozrieme na niektoré štandardné triedy súvisiace s dátumom a časom v Jave a potom si predstavíme niekoľko možností tretích strán.

Ak sa chcete dozvedieť viac informácií o rozhraní Java 8 DateTime API, odporúčame vám prečítať si tento článok.

2. java.util.Date

Ak používame Java 7 alebo nižšiu verziu, môžeme použiť java.util.Date a java.util.Calendar triedy pre väčšinu spracovania súvisiaceho s dátumom a časom.

Pozrime sa, ako pridať n hodiny k danému Dátum objekt:

verejné Dátum addHoursToJavaUtilDate (dátum, dátum, hodiny) {Calendar calendar = Calendar.getInstance (); calendar.setTime (dátum); calendar.add (Calendar.HOUR_OF_DAY, hodiny); vrátiť calendar.getTime (); }

Poznač si to Kalendár.HOUR_OF_DAY odkazuje na 24-hodinový čas.

Vyššie uvedená metóda vráti nový Dátum objekt, ktorého hodnota by bola buď (dátum + hodiny) alebo (dátum - hodiny), podľa toho, či dosiahneme kladnú alebo zápornú hodnotu hodín resp.

Predpokladajme, že máme aplikáciu Java 8, ale napriek tomu s ňou chceme pracovať java.util.Date inštancie.

V takom prípade sa môžeme rozhodnúť zvoliť nasledujúci alternatívny prístup:

  1. Použite java.util.DatetoInstant () metóda prevodu a Dátum namietať voči a java.time.Instant inštancia
  2. Pridajte konkrétny údaj Trvanie do java.time.Instant objekt pomocou plus() metóda
  3. Obnovte naše java.util.Date napríklad odovzdaním java.time.Instant namietať proti java.util.Date.from () metóda

Poďme sa rýchlo pozrieť na tento prístup:

@Test public void givenJavaUtilDate_whenUsingToInstant_thenAddHours () {Date actualDate = new GregorianCalendar (2018, Calendar.JUNE, 25, 5, 0) .getTime (); Dátum očakávanýDátum = nový GregorianCalendar (2018, Calendar.JUNE, 25, 7, 0) .getTime (); assertThat (Date.from (actualDate.toInstant (). plus (Duration.ofHours (2))))) .isEqualTo (expectDate); }

Všimnite si však, že vždy sa odporúča používať nové API DateTime pre všetky aplikácie vo verziách Java 8 alebo vyšších.

3. java.time.LocalDateTime / ZonedDateTime

V prostredí Java 8 alebo novšom sa pridaním hodín buď a java.time.LocalDateTime alebo java.time.ZonedDateTime inštancia je celkom jednoduchá a využíva plusHours () metóda:

@Test public void givenLocalDateTime_whenUsingPlusHours_thenAddHours () {LocalDateTime actualDateTime = LocalDateTime .of (2018, mesiac.JUNE, 25, 5, 0); LocalDateTime expectDateTime = LocalDateTime. z (2018, mesiac.JÚN, 25., 10., 0); assertThat (actualDateTime.plusHours (5)). isEqualTo (expectDateTime); }

Čo ak si chceme odpočítať niekoľko hodín?

Prenesenie zápornej hodnoty hodín do plusHours () metóda by bola v pohode. Odporúča sa však použiť minusHours () metóda:

@Test public void givenLocalDateTime_whenUsingMinusHours_thenSubtractHours () {LocalDateTime actualDateTime = LocalDateTime .of (2018, mesiac.JUNE, 25, 5, 0); LocalDateTime expectDateTime = LocalDateTime .of (2018, month.JUNE, 25, 3, 0); assertThat (actualDateTime.minusHours (2)). isEqualTo (expectDateTime); }

The plusHours () a minusHours () metódy v java.time.ZonedDateTime funguje úplne rovnako.

4. java.time.Instant

Ako vieme, java.time.Instant predstavený v rozhraní Java 8 DateTime API predstavuje konkrétny okamih na časovej osi.

Ak chcete pridať nejaké hodiny do Okamžité objekt, môžeme použiť jeho plus() metóda s a java.time.temporal.TemporalAmount:

@Test public void givenInstant_whenUsingAddHoursToInstant_thenAddHours () {Instant actualValue = Instant.parse ("2018-06-25T05: 12: 35Z"); Okamžitá očakávaná hodnota = Instant.parse ("2018-06-25T07: 12: 35Z"); assertThat (actualValue.plus (2, ChronoUnit.HOURS)) .isEqualTo (expectValue); }

Podobne mínus () možno použiť metódu na odčítanie konkrétnej TemporalAmount.

5. Apache Commons DateUtils

The DateUtils triedy z knižnice Apache Commons Lang vystavuje a statickýaddHours () metóda:

verejná statická Dátum addHours (dátum dátum, int suma)

Metóda prijíma a java.util.Date objekt spolu s čiastka chceli by sme k tomu pridať, ktorého hodnota môže byť pozitívna alebo negatívna.

Nový java.util.Date objekt sa vráti ako výsledok:

@Test public void givenJavaUtilDate_whenUsingApacheCommons_thenAddHours () {Date actualDate = nový GregorianCalendar (2018, Calendar.JUNE, 25, 5, 0) .getTime (); Dátum očakávanýDátum = nový GregorianCalendar (2018, Calendar.JUNE, 25, 7, 0) .getTime (); assertThat (DateUtils.addHours (actualDate, 2)). isEqualTo (expectDate); }

Najnovšia verzia servera Apache Commons Lang je k dispozícii v Maven Central.

6. Joda Time

Joda Time je alternatívou k Java 8 DateTime API a poskytuje jej vlastné Dátum Čas implementácie.

Väčšina z toho Dátum Čas súvisiace triedy vystavujú plusHours () a minusHours () metódy, ktoré nám pomôžu sčítať alebo odčítať daný počet hodín od a Dátum Čas objekt.

Pozrime sa na príklad:

@Test public void givenJodaDateTime_whenUsingPlusHoursToDateTime_thenAddHours () {DateTime actualDateTime = nový DateTime (2018, 5, 25, 5, 0); DateTime expectDateTime = nový DateTime (2018, 5, 25, 7, 0); assertThat (actualDateTime.plusHours (2)). isEqualTo (expectDateTime); }

Môžeme ľahko skontrolovať najnovšiu dostupnú verziu aplikácie Joda Time v Maven Central.

7. Záver

V tomto tutoriáli sme sa venovali niekoľkým spôsobom, ako pridať alebo odčítať daný počet hodín od štandardných hodnôt dátumu a času v Jave.

Pozreli sme sa tiež na niektoré knižnice tretích strán ako na alternatívu. Celý zdrojový kód je ako obvykle k dispozícii na serveri GitHub.


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