Získanie čísla týždňa od ľubovoľného dátumu

1. Úvod

V tomto článku si preštudujeme niekoľko možností, ktoré môžeme v Jave použiť na získanie čísla týždňa pre daný dátum. Začneme tým, že sa pozrieme na niekoľko možností pre starší kód pomocou tried pred verziou Java 8. Potom sa pozrieme na novšie API Date Time v java.time balík, ktorý bol predstavený v prostredí Java 8.

2. Pred programom Java 8

Pred jazykom Java 8 sa výpočty dátumu a času vykonávali hlavne pomocou súboru Dátum a Kalendár triedy. Spravidla vytvárame a Kalendár, a potom je možné z nej extrahovať potrebné informácie pomocou rôznych konštánt.

2.1. Získajte číslo týždňa pomocou Kalendár Polia

Pozrime sa na náš prvý príklad:

Calendar calendar = Calendar.getInstance (miestne nastavenie); calendar.set (rok, mesiac, deň); int weekOfYear = calendar.get (Calendar.WEEK_OF_YEAR);

Jednoducho vytvoríme a Kalendár napríklad pre dané Miestne nastavenie a nastavíme rok, mesiac a deň a nakoniec dostaneme WEEK_OF_YEAR pole z kalendár objekt. Takto sa vráti číslo týždňa v aktuálnom roku.

Poďme sa teraz pozrieť na to, ako vyvolať túto metódu z jedného z našich testov jednotiek:

@Test public void givenDateUsingFieldsAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly () {Calendar calendar = Calendar.getInstance (Locale.ITALY); calendar.set (2020, 10, 22); assertEquals (47, calendar.get (Calendar.WEEK_OF_YEAR)); }

Pri prijímaní tohto prístupu, ako je mesiac v poli, musíme byť opatrní Kalendár trieda je založená na nule. To znamená, že ak chceme špecifikovať december, potom musíme použiť číslo 11, čo môže často viesť k zámene.

2.2. Získajte číslo týždňa pomocou Miestne nastavenie Nastavenia

V tomto predposlednom príklade sa pozrieme na to, aký vplyv bude mať na naše použitie niektoré ďalšie nastavenia Kalendár môže mať:

Calendar calendar = Calendar.getInstance (); calendar.setFirstDayOfWeek (firstDayOfWeek); calendar.setMinimalDaysInFirstWeek (minimalDaysInFirstWeek); calendar.set (rok, mesiac, deň); int weekOfYear = calendar.get (Calendar.WEEK_OF_YEAR); 

The Kalendár trieda definuje dve metódy:

  • setFirstDayOfWeek
  • setMinimalDaysInFirstWeek

Tieto metódy majú vplyv na spôsob výpočtu počtu týždňov. Za normálnych okolností sú obe tieto hodnoty prevzaté z hodnoty Miestne nastavenie pri vytváraní Kalendár. Je však tiež možné nastaviť prvý deň v týždni a minimálne dni v prvom týždni v roku manuálne.

2.3. Miestne nastavenie Rozdiely

Pri výpočte počtu týždňov hrá dôležitú úlohu miestne nastavenie:

@Test public void givenDateUsingFieldsAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly () {Calendar calendar = Calendar.getInstance (Locale.CANADA); calendar.set (2020, 10, 22); assertEquals (48, calendar.get (Calendar.WEEK_OF_YEAR)); } 

V tomto teste jednotky sme zmenili iba miestne nastavenie Kalendár použit Locale.CANADA namiesto Miestne nastavenie.ITALY a teraz je vrátené číslo týždňa 48 namiesto 47.

Oba výsledky sú správne. Ako už bolo spomenuté vyššie, stáva sa to preto, lebo každý z nich Miestne nastavenie má rôzne nastavenia pre setFirstDayOfWeek a setMinimalDaysInFirstWeek metódy.

3. Java 8 Dátum Čas API

Java 8 predstavila nové API pre Windows Dátum a Čas na riešenie nedostatkov starších java.util.Date a java.util.Calendar.

V tejto časti sa pozrieme na niektoré možnosti získania čísla týždňa od dátumu pomocou tohto novšieho rozhrania API.

3.1. Získajte číslo týždňa pomocou číselných hodnôt

Rovnako, ako sme už videli predtým Kalendár, môžeme tiež priamo preniesť hodnoty roku, mesiaca a dňa LocalDate:

LocalDate date = LocalDate.of (rok, mesiac, deň); int weekOfYear = date.get (WeekFields.of (locale) .weekOfYear ()); 

Výhodou oproti našim príkladom z obdobia pred Java 8 je, že nemáme problém s tým, že pole mesiac bude založené na nule.

3.2. Získajte číslo týždňa pomocou Chronofield

V tomto poslednom príklade uvidíme, ako používať ChronoField výčet, ktorým sa vykonáva TemporalField rozhranie:

LocalDate date = LocalDate.of (rok, mesiac, deň); int weekOfYear = date.get (ChronoField.ALIGNED_WEEK_OF_YEAR); 

Tento príklad je podobný použitiu súboru Kalendár.WEEK_OF_YEARint konštanta, ktorú sme videli predtým, ale pomocou ChronoField.ALIGNED_WEEK_OF_YEAR.

4. Záver

V tomto rýchlom výučbe sme ilustrovali niekoľko spôsobov, ako získať číslo týždňa z dátumu pomocou obyčajnej Javy.

Celý zdrojový kód článku je ako vždy k dispozícii na GitHub.


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