Mendapatkan Nomor Minggu Dari Tanggal Mana Saja

1. Perkenalan

Pada artikel ini, kita akan mempelajari beberapa opsi yang dapat kita gunakan di Java untuk mendapatkan nomor minggu pada tanggal tertentu. Kita akan mulai dengan melihat beberapa opsi untuk kode lama menggunakan kelas sebelum Java 8. Setelah itu, kita akan melihat API Waktu Tanggal yang lebih baru dalam paket java.time yang diperkenalkan di Java 8.

2. Sebelum Java 8

Sebelum Java 8, perhitungan tanggal dan waktu dilakukan terutama menggunakan kelas Tanggal dan Kalender . Biasanya kami membuat Kalender , dan kemudian dimungkinkan untuk mengekstrak informasi yang kami butuhkan darinya dengan menggunakan konstanta yang berbeda.

2.1. Dapatkan Nomor Minggu Menggunakan Bidang Kalender

Mari kita lihat contoh pertama kita:

Calendar calendar = Calendar.getInstance(locale); calendar.set(year, month, day); int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);

Kami hanya membuat instance Kalender untuk Lokal tertentu dan mengatur tahun, bulan, dan hari, dan akhirnya, kami mendapatkan bidang WEEK_OF_YEAR dari objek kalender . Ini akan mengembalikan nomor minggu dalam tahun ini.

Sekarang, mari kita lihat cara memanggil metode ini dari salah satu pengujian unit kami:

@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)); }

Kita perlu berhati-hati saat mengadopsi pendekatan ini, karena bidang bulan di kelas Kalender berbasis nol. Ini berarti jika kita ingin menentukan Desember, maka kita perlu menggunakan angka 11, yang seringkali menimbulkan kebingungan.

2.2. Dapatkan Nomor Minggu Menggunakan Pengaturan Lokal

Dalam contoh kedua dari belakang ini, kita akan melihat apa efek dari penerapan beberapa pengaturan tambahan pada Kalender kita :

Calendar calendar = Calendar.getInstance(); calendar.setFirstDayOfWeek(firstDayOfWeek); calendar.setMinimalDaysInFirstWeek(minimalDaysInFirstWeek); calendar.set(year, month, day); int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR); 

Kelas Kalender mendefinisikan dua metode:

  • setFirstDayOfWeek
  • setMinimalDaysInFirstWeek

Metode ini berdampak pada cara kami menghitung angka minggu. Biasanya, kedua nilai ini diambil dari Lokal saat membuat Kalender . Tetapi dimungkinkan juga untuk mengatur hari pertama dalam seminggu dan hari-hari minimal di minggu pertama dalam setahun secara manual.

2.3. Perbedaan Lokal

Lokal memainkan peran penting dalam cara menghitung angka minggu:

@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)); } 

Dalam pengujian unit ini, kami hanya mengubah lokal Kalender untuk menggunakan Locale.CANADA daripada Locale.ITALY dan sekarang angka minggu yang dikembalikan adalah 48 dan bukan 47 .

Kedua hasil tersebut benar. Seperti disebutkan sebelumnya, hal ini terjadi karena masing-masing Lokal memiliki pengaturan yang berbeda untuk setFirstDayOfWeek dan setMinimalDaysInFirstWeek metode .

3. API Tanggal Waktu Java 8

Java 8 memperkenalkan API baru untuk Tanggal dan Waktu guna mengatasi kekurangan java.util.Date dan java.util.Calendar .

Di bagian ini, kita akan melihat beberapa opsi untuk mendapatkan nomor minggu sejak tanggal menggunakan API yang lebih baru ini.

3.1. Dapatkan Nomor Minggu Menggunakan Nilai Numerik

Demikian juga, seperti yang kita lihat sebelumnya dengan Kalender , kita juga bisa meneruskan nilai tahun, bulan, dan hari langsung ke LocalDate :

LocalDate date = LocalDate.of(year, month, day); int weekOfYear = date.get(WeekFields.of(locale).weekOfYear()); 

Manfaat dari contoh pra-Java 8 kami adalah kami tidak memiliki masalah bidang bulan menjadi berbasis nol.

3.2. Dapatkan Nomor Minggu Menggunakan Chronofield

Dalam contoh terakhir ini kita akan melihat bagaimana menggunakan enumerasi ChronoField , yang mengimplementasikan antarmuka TemporalField :

LocalDate date = LocalDate.of(year, month, day); int weekOfYear = date.get(ChronoField.ALIGNED_WEEK_OF_YEAR); 

Contoh ini mirip dengan menggunakan konstanta int Calendar.WEEK_OF_YEAR yang kita lihat sebelumnya, tetapi menggunakan ChronoField.ALIGNED_WEEK_OF_YEAR .

4. Kesimpulan

Dalam tutorial singkat ini, kami mengilustrasikan beberapa cara mendapatkan nomor minggu dari tanggal menggunakan Java biasa.

Seperti biasa, kode sumber lengkap artikel tersedia di GitHub.