Dobivanje broja tjedna od bilo kojeg datuma

1. Uvod

U ovom ćemo članku proučiti nekoliko opcija koje možemo koristiti na Javi za dobivanje broja tjedna za određeni datum. Za početak ćemo razmotriti nekoliko opcija za naslijeđeni kôd koji koristi klase prije Jave 8. Nakon toga ćemo pogledati noviji Date Time API u java.vrijeme paket koji je predstavljen u Javi 8.

2. Prije Jave 8

Prije Java 8, izračunavanje datuma i vremena vršilo se uglavnom pomoću Datum i Kalendar razreda. Tipično stvaramo Kalendar, a zatim je iz njih moguće izvući podatke koji su nam potrebni pomoću različitih konstanti.

2.1. Nabavite broj tjedna koristeći Kalendar Polja

Pogledajmo naš prvi primjer:

Kalendar kalendara = Calendar.getInstance (lokalizacija); calendar.set (godina, mjesec, dan); int weekOfYear = calendar.get (Calendar.WEEK_OF_YEAR);

Jednostavno stvaramo Kalendar primjer za dano Lokalno i postavite godinu, mjesec i dan i na kraju dobivamo WEEK_OF_YEAR polje od kalendar objekt. To će vratiti broj tjedna u tekućoj godini.

Sada, pogledajmo kako pozvati ovu metodu iz jednog od naših jediničnih testova:

@Test javna praznina givenDateUsingFieldsAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrect () {Kalendar kalendara = Calendar.getInstance (Locale.ITALY); calendar.set (2020, 10, 22); assertEquals (47, calendar.get (Calendar.WEEK_OF_YEAR)); }

Moramo biti oprezni kada usvajamo ovaj pristup, kao polje mjeseca u Kalendar klasa se temelji na nuli. To znači da ako želimo odrediti prosinac, tada moramo koristiti broj 11, što često može dovesti do zabune.

2.2. Nabavite broj tjedna koristeći Lokalno Postavljanje

U ovom pretposljednjem primjeru pogledat ćemo kakav je učinak primjene nekih dodatnih postavki na naše Kalendar mogu imati:

Kalendar kalendara = Calendar.getInstance (); calendar.setFirstDayOfWeek (firstDayOfWeek); calendar.setMinimalDaysInFirstWeek (minimalDaysInFirstWeek); calendar.set (godina, mjesec, dan); int weekOfYear = calendar.get (Calendar.WEEK_OF_YEAR); 

The Kalendar klasa definira dvije metode:

  • setFirstDayOfWeek
  • setMinimalDaysInFirstWeek

Ove metode utječu na to kako izračunavamo broj tjedna. Obje su ove vrijednosti obično preuzete iz Lokalno prilikom stvaranja Kalendar. No moguće je i prvi dan u tjednu i minimalne dane u prvom tjednu u godini postaviti ručno.

2.3. Lokalno Razlike

Locale igra važnu ulogu u izračunavanju broja tjedna:

@Test javna praznina givenDateUsingFieldsAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrect () {Kalendar kalendara = Calendar.getInstance (Locale.CANADA); calendar.set (2020, 10, 22); assertEquals (48, calendar.get (Calendar.WEEK_OF_YEAR)); } 

U ovom jediničnom testu promijenili smo samo lokalitet Kalendar koristiti Lokal.KANADA umjesto Lokalno.ITALNO i sada je vraćen broj tjedna 48 umjesto 47.

Oba su rezultata točna. Kao što je prethodno spomenuto, to se događa zato što svaki Lokalno ima različite postavke za setFirstDayOfWeek i setMinimalDaysInFirstWeek metode.

3. Java 8 Datum vrijeme API

Java 8 predstavila je nove API-je za Datum i Vrijeme rješavati nedostatke starijih java.util.Datum i java.util.Kalendar.

U ovom ćemo odjeljku pogledati neke opcije za dobivanje broja tjedna od datuma pomoću ovog novijeg API-ja.

3.1. Dohvatite broj tjedna koristeći numeričke vrijednosti

Isto tako, kao što smo prije vidjeli sa Kalendar, također možemo izravno prenijeti vrijednosti godine, mjeseca i dana LocalDate:

LocalDate date = LocalDate.of (godina, mjesec, dan); int weekOfYear = date.get (WeekFields.of (locale) .weekOfYear ()); 

Prednost u odnosu na naše primjere prije Java 8 jest ta što nemamo problem s tim da polje mjeseca nije nula.

3.2. Nabavite broj tjedna koristeći Chronofield

U ovom posljednjem primjeru vidjet ćemo kako se koristi ChronoField popisivanje, koje provodi TemporalField sučelje:

LocalDate date = LocalDate.of (godina, mjesec, dan); int weekOfYear = date.get (ChronoField.ALIGNED_WEEK_OF_YEAR); 

Ovaj je primjer sličan korištenju Kalendar.TJEDN_F_GODINAint konstanta koju smo ranije vidjeli, ali pomoću ChronoField.ALIGNED_WEEK_OF_YEAR.

4. Zaključak

U ovom smo brzom vodiču ilustrirali nekoliko načina dobivanja broja tjedna s datuma pomoću obične Jave.

Kao i uvijek, puni izvorni kôd članka dostupan je na GitHub-u.