Mendapatkan Nombor Minggu Dari Mana-mana Tarikh

1. Pengenalan

Dalam artikel ini, kami akan mengkaji beberapa pilihan yang dapat kami gunakan di Java untuk mendapatkan jumlah minggu untuk suatu tarikh. Kita akan mulakan dengan melihat beberapa pilihan untuk kod lama menggunakan kelas sebelum Java 8. Selepas itu, kita akan melihat API Date Time yang lebih baru dalam pakej java.time yang diperkenalkan di Java 8.

2. Sebelum Jawa 8

Sebelum Java 8, pengiraan tarikh dan waktu dilakukan terutamanya menggunakan kelas Tarikh dan Kalendar . Biasanya kita membuat Kalendar , dan kemudian mungkin untuk mengekstrak maklumat yang kita perlukan darinya dengan menggunakan pemalar yang berbeza.

2.1. Dapatkan Nombor Minggu Menggunakan Medan Kalendar

Mari lihat contoh pertama kami:

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

Kami hanya membuat contoh Kalendar untuk Lokal yang diberikan dan menetapkan tahun, bulan, dan hari, dan akhirnya, kami mendapat medan WEEK_OF_YEAR dari objek kalendar . Ini akan mengembalikan nombor minggu dalam tahun semasa.

Sekarang, mari kita lihat bagaimana menggunakan kaedah ini dari salah satu ujian 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 harus berhati-hati ketika menggunakan pendekatan ini, kerana bidang bulan di kelas Kalendar adalah berdasarkan sifar. Ini bermaksud jika kita ingin menentukan bulan Disember, maka kita perlu menggunakan angka 11, yang sering menimbulkan kekeliruan.

2.2. Dapatkan Nombor Minggu Menggunakan Persediaan Lokal

Dalam contoh kedua terakhir ini, kita akan melihat bagaimana kesan penggunaan beberapa tetapan tambahan pada Kalendar kita :

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

The Kalendar kelas mentakrifkan dua kaedah:

  • setFirstDayOfWeek
  • setMinimalDaysInFirstWeek

Kaedah ini memberi kesan kepada bagaimana kita mengira bilangan minggu. Biasanya, kedua-dua nilai ini diambil dari Lokal semasa membuat Kalendar . Tetapi juga mungkin untuk menetapkan hari pertama dalam minggu dan hari minimum pada minggu pertama tahun ini secara manual.

2.3. Locale Perbezaan

Lokal memainkan peranan penting dalam bagaimana bilangan minggu dikira:

@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 ujian unit ini, kami hanya menukar lokasi Kalendar untuk menggunakan Locale.CANADA dan bukan Locale.ITALY dan sekarang jumlah minggu yang dikembalikan adalah 48 dan bukan 47 .

Kedua-dua hasilnya betul. Seperti yang dinyatakan sebelum ini, ini berlaku kerana setiap Locale mempunyai tetapan yang berlainan bagi setFirstDayOfWeek dan setMinimalDaysInFirstWeek kaedah .

3. Java 8 Tarikh Masa API

Java 8 diperkenalkan API baru untuk Tarikh dan Masa untuk menangani kelemahan yang lebih tua java.util.Date dan java.util.Calendar .

Di bahagian ini, kita akan melihat beberapa pilihan untuk mendapatkan nombor minggu dari tarikh menggunakan API yang lebih baru ini.

3.1. Dapatkan Nombor Minggu Menggunakan Nilai Berangka

Begitu juga, seperti yang kita lihat sebelumnya dengan Kalendar , kita juga dapat meneruskan nilai tahun, bulan, dan hari ke LocalDate :

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

Manfaat daripada contoh pra-Java 8 kami adalah bahawa kami tidak menghadapi masalah bidang bulan berdasarkan sifar.

3.2. Dapatkan Nombor Minggu Menggunakan Chronofield

Dalam contoh akhir ini kita akan melihat bagaimana menggunakan penghitungan ChronoField , yang menerapkan antara muka TemporalField :

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

Contoh ini adalah sama dengan menggunakan Calendar.WEEK_OF_YEAR int berterusan yang kita lihat sebelum ini, tetapi menggunakan ChronoField.ALIGNED_WEEK_OF_YEAR .

4. Kesimpulan

Dalam tutorial ringkas ini, kami menggambarkan beberapa cara untuk mendapatkan nombor minggu dari tarikh menggunakan Java biasa.

Seperti biasa, kod sumber penuh artikel terdapat di GitHub.