A hét számának megszerzése bármilyen dátumtól
1. Bemutatkozás
Ebben a cikkben több olyan opciót fogunk megvizsgálni, amelyeket Java-ban használhatunk a hét számának megszerzésére egy adott dátumra. Először megvizsgálunk néhány lehetőséget a régi kódok használatához a Java 8 előtti osztályok használatával. Ezután megnézzük az újabb Date Time API-t a java.time csomagot, amelyet a Java 8-ban vezettek be.
2. Java 8 előtt
A Java 8 előtt a dátum és az idő számítását főként a Dátum és Naptár osztályok. Jellemzően létrehozunk egy Naptár, majd különböző állandók segítségével ki lehet nyerni belőle a szükséges információkat.
2.1. Heti szám használata Naptár Mezők
Nézzük meg az első példánkat:
Naptár naptár = Calendar.getInstance (területi beállítás); calendar.set (év, hónap, nap); int weekOfYear = calendar.get (Naptár.WEEK_OF_YEAR);
Egyszerűen létrehozunk egy Naptár példány az adott Területi beállítás és állítsuk be az évet, a hónapot és a napot, végül pedig megkapjuk a WEEK_OF_YEAR mező a naptár tárgy. Ez a hét számát adja vissza az adott évben.
Most nézzük meg, hogyan hívhatjuk le ezt a módszert az egyik egységtesztünkből:
@Test public void givenDateUsingFieldsAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly () {Naptár naptár = Calendar.getInstance (Locale.ITALY); calendar.set (2020, 10, 22); assertEquals (47, calendar.get (Naptár.WEEK_OF_YEAR)); }
Óvatosnak kell lennünk, amikor ezt a megközelítést alkalmazzuk, mivel a hónap mező a Naptár osztály nulla alapú. Ez azt jelenti, hogy ha decembert akarunk megadni, akkor a 11-es számot kell használnunk, ami gyakran zavart okozhat.
2.2. Heti szám használata Területi beállítás Beállítások
Ebben az utolsó előtti példában megvizsgáljuk, hogy milyen hatással van néhány további beállítás alkalmazása a mi rendszerünkre Naptár lehet:
Naptár naptár = Calendar.getInstance (); calendar.setFirstDayOfWeek (firstDayOfWeek); calendar.setMinimalDaysInFirstWeek (minimalDaysInFirstWeek); calendar.set (év, hónap, nap); int weekOfYear = calendar.get (Naptár.WEEK_OF_YEAR);
A Naptár osztály két módszert határoz meg:
- setFirstDayOfWeek
- setMinimalDaysInFirstWeek
Ezek a módszerek hatással vannak a hét számának kiszámítására. Normál esetben mindkét értéket a Területi beállítás a Naptár. De a hét első napját és az év első hetének minimális napjait manuálisan is beállíthatja.
2.3. Területi beállítás Különbségek
A területi beállítás fontos szerepet játszik a hét számításában:
@Test public void givenDateUsingFieldsAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly () {Calendar calendar = Calendar.getInstance (Locale.CANADA); calendar.set (2020, 10, 22); assertEquals (48, calendar.get (Naptár.WEEK_OF_YEAR)); }
Ebben az egységtesztben csak a Naptár használni Locale.CANADA ahelyett Locale.ITALY és most a visszaadott hét száma az 48 ahelyett 47.
Mindkét eredmény helyes. Mint korábban említettük, ez azért történik, mert mindegyik Területi beállítás különböző beállításai vannak a setFirstDayOfWeek és setMinimalDaysInFirstWeek mód.
3. Java 8 Dátum idő API
A Java 8 új API-kat vezetett be a Dátum és Idő az idősebbek hiányosságainak orvoslására java.util.Dátum és java.util.Naptár.
Ebben a szakaszban megvizsgálunk néhány lehetőséget a hét számának lekérésére a dátumtól ezen újabb API használatával.
3.1. Heti szám beszerzése a numerikus értékek használatával
Hasonlóképpen, ahogyan korábban láttuk Naptár, az év, hónap és nap értékeket közvetlenül át is adhatjuk LocalDate:
LocalDate date = LocalDate.of (év, hónap, nap); int weekOfYear = date.get (WeekFields.of (locale) .weekOfYear ());
Előnye a Java 8 előtti példáinkkal szemben az, hogy nincs azzal a problémával, hogy a hónap mező nulla alapú legyen.
3.2. Heti szám használata Chronofield
Ebben az utolsó példában megtudjuk, hogyan kell használni a ChronoField felsorolás, amely végrehajtja a TemporalField felület:
LocalDate date = LocalDate.of (év, hónap, nap); int weekOfYear = date.get (ChronoField.ALIGNED_WEEK_OF_YEAR);
Ez a példa hasonló a Naptár.WEEK_OF_YEARint állandó, amit korábban láttunk, de használjuk ChronoField.ALIGNED_WEEK_OF_YEAR.
4. Következtetés
Ebben a gyors bemutatóban számos módszert szemléltettünk, hogyan lehet a hét számát dátumról lekérni a sima Java használatával.
Mint mindig, a cikk teljes forráskódja elérhető a GitHubon.