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:
- Použite java.util.DatetoInstant () metóda prevodu a Dátum namietať voči a java.time.Instant inštancia
- Pridajte konkrétny údaj Trvanie do java.time.Instant objekt pomocou plus() metóda
- 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.