Saya sedang mengerjakan sebuah proyek. Di sana saya harus menemukan total minggu dalam setahun. Saya mencoba dengan kode berikut, tetapi saya mendapatkan jawaban yang salah: 2020 memiliki 53 minggu, tetapi kode ini memberikan 52 minggu.
Di mana saya salah dalam kode ini?
package com.hib.mapping;
import java.time.LocalDate;
import java.time.temporal.WeekFields;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.joda.time.DateTime;
public class TestWeek {
public static void main(String args[]) {
System.out.println(getWeeks());
}
public static int getWeeks() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2020);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
GregorianCalendar gregorianCalendar = new GregorianCalendar();
int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (gregorianCalendar.isLeapYear(2020)) {
if (weekDay == Calendar.THURSDAY || weekDay == Calendar.WEDNESDAY)
return 53;
else
return 52;
} else {
if (weekDay == Calendar.THURSDAY)
return 53;
else
return 52;
}
}
}
Keluaran:
52
java
date
java-8
week-number
Kumaresan Perumal
sumber
sumber
Date
danCalendar
. Gunakanjava.time
sebagai gantinya, itu jauh lebih baik dan lebih sederhana.Jawaban:
Menggunakan definisi Wikipedia di sini . Satu tahun memiliki 53 minggu jika 1 Januari adalah hari Kamis, atau 31 Desember adalah hari Kamis, jika tidak maka akan ada 52 minggu. Definisi ini setara dengan yang Anda gunakan. Saya pikir ini adalah kondisi yang lebih mudah untuk diperiksa, karena Anda tidak perlu memeriksa tahun kabisat.
Menggunakan Java 8
java.time
APIs:sumber
tl; dr
Untuk minggu ISO 8601 standar, gunakan
YearWeek
kelas dari pustaka ThreeTen-Extra dengan pernyataan ternary.Itu adalah,
YearWeek.of( 2020 , 1 ).is53WeekYear() ? 53 : 52
Tentukan "minggu"
Anda perlu menentukan satu minggu. Dalam sampel kode Anda, definisi minggu bervariasi sesuai dengan standar JVM saat ini
Locale
. Jadi hasil Anda dapat bervariasi saat runtime.Kode Anda juga menggunakan kelas tanggal-waktu mengerikan yang digantikan tahun lalu oleh kelas java.time modern . Hentikan penggunaan
GregorianCalendar
&Calendar
; mereka diganti karena alasan yang baik.ISO 8601 minggu
The ISO 8601 standar mendefinisikan seminggu sebagai:
Definisi itu berarti:
Jika definisi Anda berbeda, lihat Jawaban oleh Ole VV .
YearWeek:is53WeekYear
Jika ini sesuai dengan definisi Anda, kemudian tambahkan pustaka ThreeTen-Extra ke proyek Anda untuk memperluas fungsionalitas java.time yang ada di Java 8 dan yang lebih baru. Anda kemudian memiliki akses ke
YearWeek
kelas.Untuk bertanya tentang tahun tertentu berdasarkan tahun, pilih saja minggu apa saja dalam setahun. Misalnya, untuk tahun 2020 berbasis minggu kami meminta minggu # 1.
Perhatikan bagaimana hari pertama tahun berbasis tahun 2020 dari kalender-tahun 2019.
sumber
now
. Karena Anda ingin mendapatkan hitungan minggu untuk tahun tertentu, alih-alih tahun ini, gunakan sajaYearWeek.of(yourYear, 1)
.Asia/Kolkata
, saat ini dengan offset +05: 30. Dalam kode Java:ZoneId.of( "Asia/Kolkata" )
. Untuk info dan sejarah lebih lanjut, lihat Wikipedia, Waktu di India .Solusi fleksibel
Ini harus bekerja untuk setiap skema penomoran minggu yang dapat direpresentasikan dalam suatu
WeekFields
objek.Idenya adalah untuk menemukan nomor minggu dari minggu terakhir tahun berbasis minggu. Saya coba dulu dengan 31 Desember, tapi itu mungkin di minggu pertama tahun berikutnya. Jika demikian, saya kembali satu minggu.
Saya telah menguji cukup menyeluruh dengan
WeekFields.ISO
, tidak begitu banyak denganWeekFields
benda lain , tetapi seperti yang saya katakan, saya percaya itu berhasil.Jika Anda tahu pasti bahwa Anda akan selalu membutuhkan ISO 8601 minggu, saya pikir Anda harus pergi dengan salah satu jawaban yang baik oleh Sweeper dan oleh Basil Bourque . Saya memposting ini jika Anda membutuhkan solusi yang lebih fleksibel yang akan bekerja dengan skema penomoran minggu lainnya juga.
Gunakan java.time
Kode dalam pertanyaan Anda lucu karena mengimpor kelas baik dari Joda-Time dan dari java.time, namun menggunakan yang lama
Calendar
danGregorianCalendar
dari Java 1.1. Kelas-kelas ini dirancang dengan buruk dan sekarang sudah usang, Anda tidak boleh menggunakannya. Joda-Time dalam mode pemeliharaan, java.time telah mengambil alih setelahnya. Itulah yang saya gunakan dan sarankan Anda gunakan.sumber
Saya pikir ini harus bekerja dengan baik juga:
sumber
Setelah mencoba banyak di java 8. Saya tidak dapat menemukan solusi. kemudian aku menyiapkan tanggal dan waktu ketergantungan Joda. Itu memberi saya jawaban yang baik seperti yang saya harapkan
kode:
Ketergantungan Maven:
sumber