Bagian Satu Pendahuluan
Definisi Kalender:
Kalender kelas abstrak publik mengimplementasikan serializable, clonable, sebanding <Calendar> {} Kalender dapat dianggap sebagai kelas abstrak.
Implementasinya mengadopsi metode pabrik dalam pola desain. Ini dimanifestasikan dalam: Ketika kita mendapatkan instance kalender, kalender akan mengembalikan objek kalender yang sesuai berdasarkan parameter yang dilewatkan. Ada dua cara untuk mendapatkan contoh kalender:
(1) Ketika kita mendapatkan kalender melalui calendar.getInstance (), standarnya adalah objek Gregoriancalendar yang dikembalikan.
Gregoriancalendar adalah kelas implementasi kalender yang menyediakan sistem kalender standar yang digunakan di sebagian besar negara di dunia.
(2) Ketika kami mendapatkan kalender melalui kalender.getInstance (TimeZone TimeZone, Locale Locale) atau Kalender.
Misalnya, jika itu adalah Jepang, objek Jepangimperialcalendar dikembalikan.
Lihat kode berikut:
Kalender statis public getInstance () {// call createCalendar () untuk membuat kalender kalender = createCalendar (timezone.getDefaultref (), locale.getDefault ()); cal.sharedzone = true; return cal;}public static Calendar getInstance(TimeZone zone){ // Call createCalendar() to create calendar return createCalendar(zone, Locale.getDefault());}public static Calendar getInstance(Locale aLocale) { // Call createCalendar() to create calendar Calendar = createCalendar(TimeZone.getDefaultRef(), Alocale); cal.sharedzone = true; Return Cal;} Kalender Statis Publik GetInstance (TimeZone Zone, Locale Alocale) {// Call CreateCalendar () untuk membuat Kalender Pengembalian CreateCalendar (Zone, Alocale);} Private Static Calendar CreateCalendar (Timezone Zone, Locale Alocale) {// (01) Jika itu, "The RoumeR" The Return, " adalah "JP", ia mengembalikan objek JepangImperialCalendar if ("th" .equals (alocale.getLanguage ()) && ("th" .equals (alocale.getCountry ()))) {return new Sun.util.budhistcalendar (zona, alocale); } else if ("jp" .equals (alocale.getVariant ()) && "jp" .equals (alocale.getCountry ())) && "ja" .equals (alocale.getLangeage ()))) {return New Japaneseimperalcalendar (zona, alocale); } // (03) Sebaliknya, kembalikan objek GregorianCalendar. mengembalikan Gregoriancalendar baru (Zone, Alocale); }Setelah kami mendapatkan contoh kalender, kami dapat memanipulasi kalender melalui beberapa metode kolom yang disediakan oleh kalender.
Bagian 2 Prinsip dan Pikiran Kalender
Ketika kami menggunakan kalender, kami tidak lebih dari mengoperasikan bidang "tahun, bulan, hari, minggu, jam, menit, dan kedua" kalender. Di bawah ini, kami mempelajari sumber, definisi dan metode perhitungan bidang ini.
1. Kalender Sumber masing -masing nilai bidang
Ketika kami menggunakan kalender, kami hanya menggunakan informasi seperti "tahun, bulan, hari, minggu, jam, menit, dan kedua". Jadi bagaimana melakukannya? Pada dasarnya, kalender menghemat waktu. Definisi berikut:
// Waktu adalah waktu saat ini, dalam milidetik. // Ini adalah perbedaan antara jarak waktu saat ini "1 Januari 1970, 0:00:00 GMT". Dilindungi waktu yang lama;
Kalender menghitung informasi seperti "tahun kalender, bulan, hari, minggu, jam, menit, kedua" berdasarkan waktu.
2. Definisi dan inisialisasi setiap bidang kalender
Informasi "tahun, bulan, hari, minggu, jam, menit, dan kedua kalender memiliki total 17 bidang.
Kami menggunakan kalender, yang tidak lebih dari 17 bidang ini. Definisi mereka adalah sebagai berikut:
(Bidang 0) Era int statis akhir publik = 0;
Deskripsi: Era.
Nilai: hanya bisa 0 atau 1. 0 berarti bc ("sebelum Kristus", yaitu, bc), 1 berarti iklan (latin "anno domini", yaitu, iklan).
(Bidang 1) tahun int statis akhir publik = 1;
Deskripsi: Tahun.
(Bidang 2) Bulan int statis akhir publik = 2;
Deskripsi: Nilai Bulanan: Dapat menjadi Januari, Februari, Maret, April, Mei, Juni, Juli, Agustus, September, Oktober, November, Desember, Undecimber.
Bulan pertama ini adalah Januari, yaitu 0.
(Bidang 3) Publik Static Int Week_of_year = 3;
Catatan: Tanggal saat ini sesuai dengan minggu tahun ini. Nilai untuk minggu pertama tahun ini adalah 1.
(Bidang 4) Publik Static Int Week_OF_Month = 4;
Catatan: Tanggal saat ini sesuai dengan minggu dalam bulan. Nilai untuk minggu pertama sebulan adalah 1.
(Bidang 5) Tanggal int statis akhir publik = 5;
Deskripsi: Hari. Nilai untuk hari pertama sebulan adalah 1.
(Bidang 5) Publik Static Int Day_OF_Month = 5;
Catatan: Sama seperti "tanggal", berarti "hari".
(Bidang 6) Publik Static Int Day_OF_YEAR = 6;
Catatan: Hari apa tanggal saat ini sesuai dengan tahun ini? Nilai untuk hari pertama tahun ini adalah 1.
(Bidang 7) Publik Static Int Day_OF_WEEK = 7;
Deskripsi: Hari apa dalam seminggu.
Nilai: Bisa jadi hari Minggu, Senin, Selasa, Rabu, Kamis, Jumat dan Sabtu.
Di antara mereka, hari Minggu adalah 1, Senin adalah 2, dan seterusnya.
(Bidang 8) Public Static Int Day_OF_WEEK_IN_MONTH = 8;
Deskripsi: Minggu berapa bulan ini.
Nilai: day_of_month 1 hingga 7 selalu sesuai dengan day_of_week_in_month 1; 8 hingga 14 selalu sesuai dengan day_of_week_in_month 2, dan seterusnya.
(Bidang 9) Int AM_PM statis akhir publik = 9;
Deskripsi: Nilai Pagi atau Sore: Bisa jadi AM atau PM. AM adalah 0, menunjukkan pagi; PM adalah 1, menunjukkan sore.
(Bidang 10) Jam int statis akhir publik = 10;
Deskripsi: Menunjukkan jam dalam sehari.
Jam digunakan untuk jam 12 jam (0 - 11). Siang dan tengah malam diwakili oleh 0, bukan 12.
(Bidang 11) Publik Static Int Hour_of_Day = 11;
Deskripsi: Menunjukkan jam dalam sehari.
Hour_of_day digunakan untuk jam 24 jam. Misalnya, pada saat 10: 04: 15.250 pm, hour_of_day adalah 22.
(Bidang 12) menit int statis final publik = 12;
Deskripsi: Berapakah menit satu jam?
Misalnya, pada saat 10: 04: 15.250 sore, menit adalah 4.
(Bidang 13) Int Statis Akhir Publik Second = 13;
Deskripsi: Yang kedua dalam satu menit.
Misalnya, pada saat 10: 04: 15.250 pm, kedua adalah 15.
(Bidang 14) Publik Static Int Millisecond = 14;
Deskripsi: Apa milidetik detik.
Misalnya, pada saat 10: 04: 15.250 PM, milidetik adalah 250.
(Bidang 15) Publik Static Int Zone_Offset = 15;
CATATAN: Milliseconds menunjukkan perkiraan offset dari GMT.
(Bidang 16) Publik statis int dst_offset = 16;
Deskripsi: milidetik menunjukkan offset waktu penghematan siang hari.
Publik statis int int field_count = 17;
17 bidang ini disimpan dalam array int. Definisi adalah sebagai berikut:
// Simpan array dari 17 bidang ini bidang int yang dilindungi []; // Fungsi Definisi Array Kalender yang Dilindungi (Zona TimeZone, Lokal Alocale) {// Inisialisasi "bidang array" bidang = int baru [field_count]; isset = boolean baru [field_count]; cap = int baru [field_count]; this.zone = zona; setWeekCountData (alocale);}Kalender yang dilindungi (zona zona waktu, lokal Alocale) Ini adalah konstruktor kalender. Ini akan dipanggil oleh konstruktor subclass -nya, sehingga membuat array baru "Simpan 17 Data Lapangan Kalender".
3. Kalender Kalender Perhitungan masing -masing Nilai Bidang
Mari kita ambil (bidang int) sebagai contoh untuk menjelaskan secara singkat perhitungan dan pengoperasian 17 bidang kalender. Dapatkan (bidang int) adalah untuk mendapatkan nilai bidang "bidang". Definisi ini adalah sebagai berikut:
Public int get (bidang int) {// Hitung nilai masing -masing bidang lengkap (); // Kembalikan nilai bidang bidang Pengembalian internalget (bidang);} Catatan: Kode GET (bidang int) sangat sederhana. Pertama, hitung nilai masing -masing bidang melalui lengkap (), dan kemudian kembalikan "nilai bidang bidang" melalui internalget (bidang).
Fungsi lengkap () adalah untuk menghitung nilai masing -masing bidang kalender. Ini didefinisikan dalam calendar.java, kodenya adalah sebagai berikut:
void lengkap yang dilindungi () {if (! iStimeset) updateTime (); if (! AREFIELDSSET ||! AREALLFIELDSSET) {computEfields (); // mengisi bidang yang tidak diatur areallfieldsset = arefieldsset = true; }} private void updateTime () {computetime (); ISTimeset = true;} updateTime () Computetime () yang disebut didefinisikan dalam kelas implementasi Calendar.java. Di bawah ini, saya mencantumkan implementasi computetime () di gregoriancalendar.java: void computetime () {// dalam mode non-lenient, melakukan pemeriksaan singkat dari kalender // bidang yang telah ditetapkan secara eksternal. Melalui ini // Pemeriksaan, nilai -nilai bidang disimpan dalam lidah asli [] // untuk melihat apakah ada di antara mereka yang dinormalisasi nanti. if (! isLenient ()) {if (originalFields == null) {originalFields = new int [field_count]; } untuk (bidang int = 0; bidang <field_count; field ++) {int value = internalget (bidang); if (isExternallyset (bidang)) {// validasi cepat untuk nilai di luar nilai jika (nilai <getMinimum (bidang) || value> getmaximum (bidang)) {lempar IllegalArgumentException baru (getFieldName (bidang)); }} originalFields [field] = value; }} // Biarkan kelas super menentukan bidang kalender mana yang akan // digunakan untuk menghitung waktu. int fieldmask = selectFields (); // tahun default untuk awal zaman. Kami tidak memeriksa // fieldmask untuk tahun karena tahun adalah bidang wajib untuk // menentukan tanggalnya. int tahun = isset (tahun)? Internalget (tahun): Epoch_year; int era = internalgetera (); if (era == bce) {tahun = 1 - tahun; } lain jika (era! = ce) {// bahkan dalam mode lenient kita melarang nilai era selain ce & bce. // (aturan normalisasi yang sama seperti add ()/roll () dapat // diterapkan di sini dalam mode lenient. Tapi pemeriksaan ini disimpan // tidak berubah untuk kompatibilitas pada 1,5.) Lempar baru ilegalargumentException ("era tidak valid"); } // Jika tahun 0 atau negatif, kita perlu mengatur nilai era nanti. if (tahun <= 0 &&! Isset (era)) {fieldmask | = era_mask; setFieldsComputed (ERA_MASK); } // Hitung waktu hari. Kami mengandalkan Konvensi bahwa // Bidang yang tidak disetel memiliki 0. Waktu Lama = 0; if (isFieldSet (fieldmask, hour_of_day)) {timeOfday += (long) internalget (hour_of_day); } else {timeOfday += internalget (jam); // Nilai default AM_PM adalah 0 yang ditunjuk AM. if (isFieldSet (fieldmask, am_pm)) {timeOfday += 12 * internalget (am_pm); }} TimeOfday *= 60; TimeOfday += internalget (menit); waktu hari *= 60; TimeOfday += Internalget (kedua); waktu hari *= 1000; TimeOfday += Internalget (milidetik); // Konversikan waktu hari menjadi jumlah hari dan // Millisecond Offset dari tengah malam. Long FixedDate = TimeOfday / One_day; TimeOfday %= One_day; while (TimeOfday <0) {TimeOfday += One_day; --fixedDate; } // Hitung tanggal tetap sejak 1 Januari, 1 (Gregorian). CalculateFixedDate: {Long GFD, JFD; if (tahun> gregoriancutoveryear && tahun> gregoriancutoveryeArjulian) {gfd = fixedDate + getFixedDate (gcal, tahun, fieldmask); if (gfd> = gregoriancutoverdate) {fixedDate = gfd; Break CalculatedFixedDate; } jfd = fixedDate + getFixedDate (getjuliancalendarsystem (), tahun, fieldmask); } lain jika (tahun <gregoriancutoveryear && tahun <gregoriancutoveryeArjulian) {jfd = fixedDate + getFixedDate (getjuliancalendarsystem (), tahun, fieldmask); if (jfd <gregoriancutoverdate) {fixedDate = jfd; Break CalculatedFixedDate; } gfd = fixedDate + getFixedDate (gcal, tahun, fieldmask); } else {gfd = fixedDate + getFixedDate (gcal, year, fieldmask); jfd = fixedDate + getFixedDate (getjuliancalendarsystem (), tahun, fieldmask); } // Sekarang kita harus menentukan tanggal kalender mana itu. if (gfd> = gregoriancutoverdate) {if (jfd> = gregoriancutoverdate) {fixedDate = gfd; } else {// tanggal dalam periode "tumpang tindih". Tidak ada cara // untuk menghilangkannya. Tentukannya menggunakan perhitungan tanggal sebelumnya. if (calsys == gcal || calsys == null) {fixedDate = gfd; } else {fixedDate = jfd; }}} else {if (jfd <gregoriancutoverdate) {fixedDate = jfd; } else {// tanggal dalam periode "hilang". if (! isLenient ()) {lempar IllegalArgumentException baru ("Tanggal yang ditentukan tidak ada"); } // Ambil tanggal Julian untuk kompatibilitas, yang // akan menghasilkan tanggal Gregorian. fixedDate = jfd; }}} // Millis mewakili waktu dinding-dinding lokal dalam milidetik. long millis = (fixedDate - ePoch_offset) * One_day + TimeOfday; // Hitung offset zona waktu dan offset DST. Ada dua potensi // ambiguitas di sini. Kami akan mengasumsikan waktu switchover jam 2:00 pagi (Wall Time) // Untuk tujuan diskusi di sini. // 1. Transisi ke DST. Di sini, waktu yang dirancang jam 2:00 pagi - 2:59 pagi // dapat berada dalam standar atau di DST tergantung. Namun, 2:00 pagi adalah representasi yang tidak valid (representasi melonjak dari 1:59:59 STD hingga 3:00:00 DST). // Kami mengasumsikan waktu standar. // 2. Transisi keluar dari DST. Di sini, waktu yang dirancang jam 1:00 pagi - 1:59 pagi // dapat berada dalam standar atau DST. Keduanya adalah representasi yang valid (Rep // melompat dari 1:59:59 DST ke 1:00:00 STD). // Sekali lagi, kami mengambil waktu standar. // Kami menggunakan objek zona waktu, kecuali pengguna telah secara eksplisit mengatur bidang zona_offset // atau dst_offset; Lalu kami menggunakan bidang -bidang itu. Zona zona waktu = getZone (); if (zonaoffsets == null) {zoneoffsets = new int [2]; } int tzmask = fieldmask & (zona_offset_mask | dst_offset_mask); if (tzmask! = (zona_offset_mask | dst_offset_mask)) {if (zona instance dari zonainfo) {((zonainfo) zona) .getoffsetsByWall (millis, zonaoffsets); } else {int gmtoffset = isFieldset (fieldmask, zona_offset)? internalget (zona_offset): zona.getRawoffset (); zone.getoffsets (Millis - GMTOFFSET, ZONAOFFSETS); }} if (tzmask! = 0) {if (isFieldset (tzmask, zona_offset)) {zonaoffsets [0] = internalget (zona_offset); } if (isFieldSet (tzmask, dst_offset)) {zonaoffsets [1] = internalget (dst_offset); }} // Sesuaikan nilai offset zona waktu untuk mendapatkan waktu UTC. millis -= zonaoffsets [0] + zonaoffsets [1]; // Tetapkan waktu kalender ini dalam waktu milidetik = Millis; int mask = computefields (fieldmask | getSetStateFields (), tzmask); if (! isLenient ()) {for (int field = 0; field <field_count; field ++) {if (! isExternallyset (field)) {lanjut; } if (originalFields [field]! = internalget (bidang)) {// Kembalikan sistem nilai bidang asli.ArrayCopy (originalFields, 0, Fields, 0, Fields.length); Lempar IllegalArgumentException baru (GetFieldName (Field)); }}} setFieldSnormalized (mask);} Selanjutnya, mari kita lihat definisi internalget (bidang). sebagai berikut:
Final Int Internalget (bidang int) {return bidang [bidang];} Dari sini kita dapat melihat bahwa Get (bidang int) pada akhirnya mengembalikan nilai melalui internalget (bidang int).
Internalget (bidang int) sebenarnya mengembalikan elemen bidang dalam array lapangan. Ini sesuai dengan 17 elemen kalender!
Singkatnya, yang perlu kita pahami adalah: kalender menghitung "tahun, bulan, hari, jam, menit, kedua" dan seterusnya berdasarkan waktu (milidetik), untuk memfasilitasi operasi kami pada "tahun, bulan, hari, jam, menit, kedua" dan sebagainya. Di bawah ini, kami memperkenalkan fungsi operasi yang relevan yang disediakan oleh kalender di bawah ini.
Bagian 3 Antarmuka Fungsi Kalender
1. Antarmuka umum 17 bidang kalender
17 bidang kalender ini mendukung antarmuka fungsi publik berikut. Untuk contoh menggunakan antarmuka umum ini, silakan merujuk ke fungsi testAllCalendarsection () dalam contoh calendArtest.java.
(1) getmaximum (bidang int)
Fungsi: Dapatkan "Nilai Maksimum Bidang". Catatan "Bandingkan perbedaan antara itu dan getActualMaximum ()". Contoh: Dalam hal bidang "Bulan". Bagaimana menggunakannya adalah:
// Dapatkan kalender kalender kalender cal = calendar.getInstance (); // Dapatkan nilai maksimum int bulan int max = cal.getmaximum (calendar.month);
Untuk mendapatkan nilai maksimum bidang lain, Anda hanya perlu mengganti bulan yang sesuai dalam contoh dengan nama bidang lainnya.
(2) GetActualMaxim (bidang int)
Fungsi: Dapatkan "nilai maksimum bidang ini di bawah tanggal saat ini". Contoh: Dalam hal bidang "Bulan". Bagaimana menggunakannya adalah:
// Dapatkan kalender kalender kalender cal = calendar.getInstance (); // Dapatkan nilai maksimum dari bulan saat ini int max = cal.getActualMaximum (calendar.month);
Untuk mendapatkan nilai maksimum bidang lain, Anda hanya perlu mengganti bulan yang sesuai dalam contoh dengan nama bidang lainnya.
Catatan: Bandingkan perbedaan antara getActualmaMimum () dan getmaximum (). Lihat contoh perbandingan di bawah ini,
A. "Nilai maksimum bidang" yang diperoleh oleh getmaximum () mengacu pada "nilai maksimum bidang" yang diperoleh di semua tanggal digabungkan.
Misalnya, tujuan getMaximum (kalender.Date) adalah untuk "mendapatkan 'maksimum hari'". Berdasarkan semua tanggal, maksimum 31 hari per bulan diperoleh. Oleh karena itu, nilai pengembalian getmaximum (kalender.date) adalah "31"!
B. GetActualMaximum () Mendapat "nilai maksimum bidang ini pada tanggal saat ini".
Misalnya, ketika tanggal 2013-09-01, getActualMaximum (Calendar.Date) adalah untuk mendapatkan "maksimum hari" dan "30". Tanggal saat ini adalah September, dan September hanya 30 hari. Oleh karena itu, nilai pengembalian getActualMaximum (Calendar.Date) adalah "30"!
(3) getMinimum (bidang int)
Fungsi: Dapatkan "Nilai Minimum Bidang". Catatan "Bandingkan perbedaan antara itu dan getActualMinimum ()". Contoh: Dalam hal bidang "Bulan". Bagaimana menggunakannya adalah:
// Dapatkan kalender kalender kalender cal = calendar.getInstance (); // Dapatkan nilai minimum bulan int min = cal.getMinimum (calendar.month);
Untuk mendapatkan nilai minimum bidang lain, Anda hanya perlu mengganti bulan yang sesuai dalam contoh dengan nama bidang lainnya.
(4) GetActualMinimum (bidang int)
Fungsi: Dapatkan "Nilai Minimum Bidang ini di bawah Tanggal Saat Ini". Contoh: Dalam hal bidang "Bulan". Gunakan metode: // Dapatkan kalender Calendar Calendar cal = calendar.getInstance (); // Dapatkan nilai minimum bulan int min = cal.getMinimum (calendar.month);
Untuk mendapatkan nilai minimum bidang lain, Anda hanya perlu mengganti bulan yang sesuai dalam contoh dengan nama bidang lainnya.
Catatan: Dalam kalender default Java, meskipun getMinimum () dan getActualMinimum () memiliki makna yang berbeda; Namun, nilai pengembalian mereka sama. Karena default kalender adalah mengembalikan objek Gregoriancalendar, di Gregoriancalendar.java, getMinimum () dan getActualMinimum () mengembalikan nilai yang sama.
(5) Dapatkan (bidang int)
Fungsi: Dapatkan "nilai saat ini dari bidang". Mendapat nilai bidang bidang saat ini. Contoh: Dalam hal bidang "Bulan". Metode "Dapatkan Nilai Bulan Saat Ini" adalah:
// Dapatkan kalender kalender kalender cal = calendar.getInstance (); // Dapatkan nilai bulan saat ini dari "kalender kal" bulan int = cal.get (calendar.month);
Untuk mendapatkan nilai saat ini dari bidang lain, Anda hanya perlu mengganti bulan yang sesuai dalam contoh dengan nama bidang lainnya.
(6) Set (bidang int, nilai int)
Fungsi: Atur "Nilai Bidang Saat Ini". Atur nilai saat ini dari bidang bidang ke Contoh Nilai: Dalam hal bidang "Bulan". Metode "mengatur nilai bulan saat ini" adalah:
// Dapatkan kalender kalender kalender cal = calendar.getInstance (); // Tetapkan nilai bulan saat ini dari "kalender kal" ke 1988 Cal.set (Calendar.month, 1988);
menjelaskan:
A. 1988 adalah nilai bulan saat ini yang ingin Anda tetapkan. Nilai pengaturan ini harus menjadi bilangan bulat.
B. Untuk mengatur nilai saat ini dari bidang lain, Anda hanya perlu mengganti bulan yang sesuai dalam contoh dengan nama bidang lainnya.
(7) Tambah (bidang int, nilai int)
Fungsi: Tambahkan nilai ke "nilai saat ini dari bidang". Tambahkan nilai ke nilai saat ini dari bidang bidang. Contoh: Dalam hal bidang "Bulan". Metode ini adalah sebagai berikut:
// Dapatkan Calendar Instance dan atur tanggal ke "2013-09-01" Calendar Cal = Calendar.getInstance (); Cal.set (Calendar.ear, 2013); Cal.set (Calendar.month, 8); Calendar (calendar.Date, 1); // Tambahkan -10 "calendar (calendar.10);
menjelaskan:
A. -10 adalah nilai tambah.
Nilai tambah bisa menjadi angka positif atau negatif.
Angka positif menunjukkan bahwa tanggal meningkat, dan angka negatif menunjukkan bahwa tanggal menurun.
Asumsi: Sekarang nilai CAL adalah "2013-09-01", sekarang kami meningkatkan nilai bidang bulan -10. Hasilnya adalah: "2012-10-01".
Mengapa ini terjadi? "2013-09-01" meningkat -10, yang berarti mengurangi tanggal ke depan 10 bulan; Hasilnya adalah "2012-10-01".
B. Di antara 17 bidang Kalender: Kecuali untuk menggulung kalender.zone_offset, pengecualian ExlegalargumentException akan dilemparkan; Bidang lain mendukung operasi ini.
C. Untuk mengatur nilai saat ini dari bidang lain, Anda hanya perlu mengganti bulan yang sesuai dalam contoh dengan nama bidang lainnya.
(8) Roll (bidang int, nilai int)
Fungsi: Roll Back "Nilai saat ini dari bidang" Contoh: Ambil bidang "Bulan". Metode "menggulung kembali nilai bulan saat ini" adalah:
// Dapatkan Calendar Instance dan atur tanggal ke "2013-09-01" Calendar Cal = Calendar.getInstance (); Cal.set (Calendar.Year, 2013); Cal.set (Calendar.month, 8); Cal.Set (Calendar.Date, 1); // "Gulir ke depan 10" Cal.roll (Calendar.10); Calendar, Calendar, 1); // "Calendar.
menjelaskan:
A. -10 adalah nilai rollback.
Ketika nilai rollback adalah angka negatif, itu berarti menggulung bidang saat ini ke depan;
Ketika nilai rollback adalah angka positif, itu berarti menggulung bidang saat ini ke belakang.
Saat memutar kembali bidang dalam kalender, jangan ubah bidang yang lebih besar!
Ini adalah perbedaan dasar antara roll () dan add ()! add () dapat mengubah bidang yang lebih besar, seperti "menggunakan add () untuk memodifikasi bidang 'bulan', dapat menyebabkan perubahan dalam bidang 'tahun'; Tapi roll () tidak akan mengubah bidang yang lebih besar, seperti "menggunakan roll () untuk memodifikasi bidang 'bulan', itu tidak akan menyebabkan perubahan dalam bidang 'tahun'."
Asumsi: Sekarang nilai CAL adalah "2013-09-01", sekarang kami meningkatkan nilai bidang bulan -10. Hasilnya adalah: "2013-10-01".
Mengapa ini terjadi? Ini karena "rollback" berarti "bergulir bolak -balik antara minimum dan maksimum". Dalam contoh ini, bulan adalah September, dan rollback sebelumnya adalah 10, dan nilainya yang diperoleh adalah Oktober, tetapi roll () tidak akan mengubah bidang "lebih besar dari bulan", sehingga bidang tahun tidak akan berubah. Jadi hasilnya adalah "2013-10-01".
B. Di antara 17 bidang Kalender: Kecuali untuk menggulung kalender.zone_offset, pengecualian ExlegalargumentException akan dilemparkan; Bidang lain mendukung operasi ini.
C. Untuk mengatur nilai saat ini dari bidang lain, Anda hanya perlu mengganti bulan yang sesuai dalam contoh dengan nama bidang lainnya.
(9) CLEAR (bidang int)
Fungsi: Hapus "Nilai Bidang Saat Ini". Kliring yang disebut sebenarnya menetapkan nilai "bidang" menjadi 0; Jika nilai minimum bidang adalah 1, itu diatur ke 1. Contoh: Dalam hal bidang "bulan". Metode "bulan yang jelas" adalah:
// Dapatkan instance kalender dan atur tanggal ke "September" Calendar Cal = Calendar.GetInstance (); Cal.Set (Calendar.month, 9); // Clear MonthCal.Clear (Calendar.month);
Untuk menghapus bidang lain, Anda hanya perlu mengganti bulan yang sesuai dalam contoh dengan nama bidang lainnya.
(10) ISSET (bidang int)
Fungsi: Tentukan apakah "bidang bidang" diatur. Jika jernih () dipanggil, lapangan menjadi "tidak ada keadaan yang ditetapkan". Contoh: Dalam hal bidang "Bulan". Metode "menilai apakah bulan ditetapkan" adalah:
// Dapatkan kalender kalender kalender cal = calendar.getInstance (); // Tentukan apakah bulan ditetapkan boolean bset = cal.isset (calendar.month);
Untuk menentukan bidang lain, Anda hanya perlu mengganti bulan yang sesuai dalam contoh dengan nama bidang lainnya.
2. Fungsi kalender lainnya
(1) Fungsi perbandingan tanggal
Fungsi perbandingan kalender terutama mencakup yang berikut:
// Bandingkan apakah tanggal, zona waktu dan konten lain dari "objek kalender saat ini" dan "kalender" sama. Boolean sama dengan (objek objek) // Apakah objek kalender saat ini lebih awal dari kalenderboolean sebelumnya (Kalender Objek) // Apakah objek kalender saat ini lebih lambat dari CalendarBoolean setelah (Kalender Objek) // Bandingkan "Objek Kalender Saat Ini" dan "Kalender". // Jika lebih awal dari "kalender", kembalikan -1 // jika sama, kembalikan 0 // jika lebih lambat dari "kalender", kembalikan 1int dibandingkan ke (kalender lainCalendar)
Untuk contoh menggunakan fungsi -fungsi ini, silakan merujuk ke fungsi test comparatorapis () dalam contoh calendArtest.java.
Contoh: Asumsikan bahwa CAL1 dan CAL2 adalah dua objek kalender.
// Metode penggunaannya adalah sebagai berikut boolean isequal = cal1.equals (cal2); boolean isbefore = cal1. Before (cal2); boolean isafter = cal1.after (cal2); int icompare = cal1.compareto (cal2);
(2) Fungsi "toleransi"
// Tetapkan "Toleransi Kalender" batal setLenient (nilai boolean) // Dapatkan "Toleransi Kalender" Boolean Islenient ()
Untuk contoh menggunakan fungsi -fungsi ini, silakan merujuk ke fungsi testlenientapis () dalam contoh calendartest.java.
menjelaskan:
Kalender memiliki dua mode yang menafsirkan bidang kalender, yaitu lunak dan tidak lenient.
A. Ketika kalender dalam mode lenient, ia dapat menerima nilai dalam kisaran yang lebih besar dari kisaran bidang kalender yang dihasilkannya. Ketika kalender menghitung ulang nilai bidang kalender sehingga nilai -nilai ini dikembalikan oleh get (), semua bidang kalender dinormalisasi.
Misalnya, GregorianCalendar dalam mode lenient menginterpretasikan bulan == Januari, day_of_month == 32 sebagai 1 Februari.
B. Ketika kalender dalam mode non-lenient, jika ada ketidakkonsistenan di bidang kalendernya, ia akan melempar pengecualian.
Misalnya, GregorianCalendar selalu menghasilkan nilai day_of_month antara 1 dan panjang bulan. Jika ada nilai bidang di luar kisaran yang telah ditetapkan, Gregoriancalendar dalam mode non-lenient melempar pengecualian saat menghitung nilai waktu atau kalender.
Catatan: Pengecualian pada langkah (02) tidak akan dilemparkan saat menggunakan set (), tetapi hanya akan dilemparkan dalam fungsi seperti get (), getTimeInmillis (), getTime (), add () dan roll (). Karena set () cukup set bendera modifikasi, dan metode seperti get () akan menyebabkan perhitungan ulang waktu, dan pengecualian akan dilemparkan saat ini!
(3) "Tahun, Bulan, Hari, TimeZone, Fungsi milidetik
// mengatur "tahun, bulan, hari," set void akhir (tahun int, bulan, hari, waktu, waktu, int kedua) // set "tahun, bulan, hari, waktu, waktu, int kedua) // set" tahun, hari, waktu, waktu, menit, tanggal final) Kencan (waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu, waktu) // Kencan. Get the time zone corresponding to Calendar TimeZone getTimeZone()// Set the time zone corresponding to Calendar void setTimeZone(TimeZone timezone)// Get the milliscondes value corresponding to Calendar, which is the milliseconds of "Calendar current date" distance from "1970-01-01 0:00:00 GMT" long getTimeInMillis()// Set the milliscondes value corresponding to Kalender membatalkan setTimeInmillis (panjang milidetik)
Untuk contoh menggunakan fungsi -fungsi ini, silakan merujuk ke fungsi testTimeapis () dalam contoh calendArtest.java.
(4) Operasi lain
// Klon CalendarObject Clone () // Dapatkan "Hari apa dalam seminggu adalah hari pertama dalam seminggu". Misalnya, di Amerika Serikat, hari ini adalah hari Minggu, dan di Prancis, hari ini adalah hari Senin. int getFirstdayofweek () // set "hari apa dalam seminggu adalah hari pertama dalam seminggu". Misalnya, di Amerika Serikat, hari ini adalah hari Minggu, dan di Prancis, hari ini adalah hari Senin. void setFirstdayofweek (nilai int) // Mendapatkan jumlah minimum hari yang diperlukan untuk minggu pertama tahun ini. Misalnya, jika minggu pertama berisi hari pertama bulan pertama tahun ini, metode ini akan kembali 1. Jika jumlah minimum hari harus satu minggu penuh, metode ini mengembalikan 7. int getMinimaldaySinfirstWeek () // menetapkan jumlah hari pertama yang diperlukan pada minggu pertama tahun ini, misalnya, jika minggu pertama yang disebutkan pada hari pertama tahun pertama kali ini, misalnya, jika minggu pertama kali ini adalah MEBOT PEINAL YANG Dibutuhkan Tahun Pertama tahun pertama, misalnya. Jadilah seminggu penuh, metode ini dipanggil dengan nilai 7. void setMinimaldaysinfirstweek (nilai int)
Untuk contoh menggunakan fungsi -fungsi ini, silakan merujuk ke fungsi testotherapis () dalam contoh calendartest.java.
Bagian 4 Contoh Penggunaan Kalender
Di bawah ini, kami mempelajari API menggunakan kalender melalui contoh. Kode Sumber CalendArtest.java adalah sebagai berikut:
Impor java.util.date; impor java.util.calendar; impor java.util.timezone; impor java.util.random; kelas publik calendartest {public static void main (string [] args) {// test calendar "antarmuka fungsi publik dengan 17 lapangan" testallcallcallcallcalcall // Tes Kalender "Antarmuka Komparatif" Test Comparatorapis (); // tes "antarmuka komparatif" testlenientapis (); // Tes Kalender Tes, TimeZone, Milisecond dan Fungsi Terkait lainnya TestTimeapis (); // Kalender uji klon (), getFirstdayofweek () dan antarmuka lainnya testotherapis (); } /** * Uji "Kalender Bidang" * * @param Cal - Objek Kalender * @param Field - "Kalender Bidang" untuk diuji. Dapat menjadi nilai -nilai berikut: * Calendar.year, Calendar.month, Calendar.Date, ... dll * @param title - title */ private static void testSection (kalender kal, bidang int, judul string) {final acak acak = acak baru (); Tanggal Tanggal Akhir = Cal.GetTime (); final int min = cal.getMinimum (bidang); // Dapatkan "Nilai Minimum Bidang" Int Final Max = Cal.GetMaximum (bidang); // Dapatkan "Field Maximum Value" Int Final AcctualMin = Cal.GetActualMinimum (bidang); // Dapatkan "Nilai minimum bidang di bawah tanggal saat ini" final int aktualMax = cal.getActualmaximum (bidang); // Dapatkan "nilai maksimum bidang di bawah tanggal saat ini" // Dapatkan "nilai saat ini dari bidang" final int ori = cal.get (bidang); // Atur "Nilai saat ini dari bidang" dan dapatkan "nilai setelah pengaturan" final int r1 = random.nextInt (maks); Cal.set (bidang, R1); final int set = cal.get (bidang); Coba {// Roll "Nilai bidang saat ini": Roll Back antara "Nilai Minimum Bidang" dan "Nilai Maksimum Bidang". // "Nilai rol" bisa positif atau negatif. cal.roll (bidang, -max); } catch (IllegalArgumentException e) {// Saat field == calendar.zone_offset, pengecualian akan dilemparkan! e.printstacktrace (); } final int roll = cal.get (bidang); // Dapatkan Nilai Acak Final Int Sign = (Random.nextInt (2) == 1)? 1: -1; final int r2 = tanda * acak.nextInt (maks); Coba {// Tambahkan "Nilai Bidang Saat Ini" dan dapatkan "Nilai Bidang Saat Ini Baru" // "Nilai Parameter" dari ADD bisa positif atau negatif. Cal.Add (Field, R2); } catch (IllegalArgumentException e) {// Saat field == calendar.zone_offset, pengecualian akan dilemparkan! e.printstacktrace (); } final int add = cal.get (bidang); // Print field information System.out.printf("%s:/n/trang is [%d - %d] actualRange is [%d - %d]. original=%d, set(%d)=%d, roll(%d)=%d, add(%d)=%d/n", title, min, max, actualMin, actualMax, ori, r1, set, -max, roll, r2, add); } / ** * Kalender uji "antarmuka fungsi publik dengan 17 bidang" * / private static void testAllCalendarsections () {// 00. Era uji lapangan (calendar.getInstance (), calendar.era, "calendar.era"); // 01. TestSection lapangan tahun (calendar.getInstance (), calendar.year, "calendar.year"); // 02. Bulan Tes Bidang (Calendar.GetInstance (), Calendar.month, "Calendar.month"); // 03. Week_of_year Field TestSection (calendar.getInstance (), calendar.week_of_year, "calendar.week_of_year"); // 04. Week_of_month Field TestSection (calendar.getInstance (), calendar.week_of_month, "calendar.week_of_month"); // 05. Tes Tes Tes Bidang (Calendar.GetInstance (), Calendar.Date, "Calendar.Date"); // 06. Day_of_month Field TestSection (calendar.getInstance (), calendar.day_of_month, "calendar.day_of_month"); // 07. Day_of_year Field TestSection (calendar.getInstance (), calendar.day_of_year, "calendar.day_of_year"); // 08. DAY_OF_WEEK field testSection(Calendar.getInstance(), Calendar.DAY_OF_WEEK, "Calendar.DAY_OF_WEEK"); // 09. DAY_OF_WEEK_IN_MONTH field testSection(Calendar.getInstance(), Calendar.DAY_OF_WEEK_IN_MONTH, "Calendar.DAY_OF_WEEK_IN_MONTH"); // 10. AM_PM field testSection(Calendar.getInstance(), Calendar.AM_PM, "Calendar.AM_PM"); // 11. HOUR field testSection(Calendar.getInstance(), Calendar.HOUR, "Calendar.HOUR"); // 12. HOUR_OF_DAY field testSection(Calendar.getInstance(), Calendar.HOUR_OF_DAY, "Calendar.HOUR_OF_DAY"); // 13. MINUTE field testSection(Calendar.getInstance(), Calendar.MINUTE, "Calendar.MINUTE"); // 14. SECOND field testSection(Calendar.getInstance(), Calendar.SECOND, "Calendar.SECOND"); // 15. MILLISECOND Field testSection(Calendar.getInstance(), Calendar.MILLISECOND, "Calendar.MILLISECOND"); // 16. ZONE_OFFSET Field testSection(Calendar.getInstance(), Calendar.ZONE_OFFSET, "Calendar.ZONE_OFFSET"); } /** * Test Calendar's "Compare Interface" */ private static void testComparatorAPIs() { // Create new cal1, and the time was 1988 Calendar cal1 = Calendar.getInstance(); cal1.set(Calendar.YEAR, 1988); // Create cal2, and the time is 2000 Calendar cal2 = Calendar.getInstance(); cal2.set(Calendar.YEAR, 2000); // Create cal3, which is a cloned object of cal111 Calendar cal3 = (Calendar)cal1.clone(); // equals determine whether the contents of "time, time zone, etc." of cal1 and cal2 are equal boolean isEqual12 = cal1.equals(cal2); // equals determine whether the contents of "time, time zone, etc." of cal1 and cal3 are equal boolean isEqual13 = cal1.equals(cal3); // Is cal1 boolean earlier than cal2 isBefore = cal1.before(cal2); // Is cal1 later than cal2 boolean isAfter = cal1.after(cal2); // Compare cal1 and cal2 // (01) If cal1 is earlier than cal2, return -1 // (02) If cal1 is equal to cal2, return 0 // (03) If cal1 is later than cal2, return 1 int icompare = cal1.compareTo(cal2); System.out.printf("/ntestComparatorAPIs: isEuqal12=%s, isEqual13=%s, isBefore=%s, isAfter=%s, icompare=%s/n", isEqual12, isEqual13, isBefore, isAfter, icompare); } /** * Test Calendar's "Compare Interface" */ private static void testLenientAPIs() { Calendar cal = Calendar.getInstance(); // Get the default "tolerance". Return true boolean oriLenient = cal.isLenient(); // The MONTH value can only be "0-11", and the bounds are exceeded here. However, since cal is currently tolerant, the exception cal.set(Calendar.MONTH, 50); // Set "tolerance" to false. cal.setLenient(false); // Get the set "tolerance" boolean curLenient = cal.isLenient(); try { // The MONTH value can only be "0-11", and the bounds are exceeded here. Moreover, cal is currently intolerant, so an exception will occur. // However, the exception will not be thrown until the next time the date is calculated. That is, the exception is not thrown back in set(), but the exception is not thrown until get() is cal.set(Calendar.MONTH, 50); // At this time, read cal. Reading will cause the value of cal to be recalculated, so an exception is thrown at this time! int m2 = cal.get(Calendar.MONTH); } catch (IllegalArgumentException e) { e.printStackTrace(); } System.out.printf("/ntestLenientAPIs: oriLenient=%s, curLenient=%s/n", oriLenient, curLenient); } /** * Test Calendar's Date, TimeZone, MilliSecond and other related functions*/ private static void testTimeAPIs() { Calendar cal = Calendar.getInstance(); // Set the time zone of cal to "GMT+8" cal.setTimeZone(TimeZone.getTimeZone("GMT+8")); // Get the current cal time zone TimeZone timezone = cal.getTimeZone(); // Set milliseconds cal.setTimeInMillis(1279419645742l); // Get milliseconds long millis = cal.getTimeInMillis(); // After setting milliseconds, the time also changed. // Get the date corresponding to cal Date date = cal.getTime(); // Set the time to "1988-08-08" cal.set(1988, 08, 08); // Set the time to "1999-09-09 09:09" cal.set(1999, 09, 09, 9, 9); // Set the time to "2000-10-10 10:10:10" cal.set(2000, 10, 10, 10, 10, 10); System.out.printf("/ntestTimeAPIs: date=%s, timezone=%s, millis=%s/n", date, timezone, millis); } /** * Test Calendar's clone(), getFirstDayOfWeek() and other interfaces*/ private static void testOtherAPIs() { Calendar cal = Calendar.getInstance(); //Clone cal Calendar clone = (Calendar)cal.clone(); // Set to 2013-01-10. // Note: 2013-01-01 is "Tuesday", 2013-01-06 is "Sunday", clone.set(Calendar.YEAR, 2013); clone.set(Calendar.MONTH, 0); clone.set(Calendar.DATE, 10); // Set "The first week of this year contains at least 1 day". // Then 2013-01-10 belongs to the second week clone.setMinimalDaysInFirstWeek(1); int m1 = clone.getMinimalDaysInFirstWeek(); int index1 = clone.get(Calendar.WEEK_OF_YEAR); // Set "The first week of this year contains at least 7 days". // Then 2013-01-10 belongs to the first week clone.setMinimalDaysInFirstWeek(7); int m2 = clone.getMinimalDaysInFirstWeek(); int index2 = clone.get(Calendar.WEEK_OF_YEAR); // Set "What day of the week is the first day of the week". clone.setFirstDayOfWeek(Calendar.WEDNESDAY); // Get "What day of the week is the first day of the week". int firstdayOfWeek = clone.getFirstDayOfWeek(); System.out.printf("/ntestOtherAPIs: firstdayOfWeek=%s, [minimalDay, WeekOfYear]={(%s, %s), (%s, %s)} %s/n", firstdayOfWeek, m1, index1, m2, index2, clone.getTime()); }}第五部分自定义的Calendar接口示例
这些接口在写日历程序时可能会用到。
源代码如下(CalendarSelfDefineTest.java):
import java.util.Calendar;/** * Some commonly used functions encapsulated according to Calendar's API*/public class CalendarSelfDefineTest { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // Set the date to "2013-09-18" cal.set(2013, Calendar.SEPTEMBER, 18); // Get "year" System.out.printf("year: %s/n", getYear(cal) ); // Get "month" System.out.printf("month: %s/n", getMonth(cal) ); // Get "Last Month" System.out.printf("previcou month: %s/n", getLastMonth(cal) ); // Get "Next Month" System.out.printf("next month: %s/n", getNextMonth(cal) ); // Get "Day" System.out.printf("day: %s/n", getDay(cal) ); // Get Cal's corresponding weekly date System.out.printf("weekday: %s/n", getWeekDay(cal) ); // Number of days this month System.out.printf("Current Month days: %s/n", getMonthDays(cal) ); // Number of days last month System.out.printf("Previcous Month days: %s/n", getPrevMonthDays(cal) ); // Number of days next month System.out.printf("Next Month days: %s/n", getNextMonthDays(cal) ); // Get the day of the week of the first day of the month System.out.printf("First day' weekday: %s/n", getFirstDayWeekday(cal) ); // Get the day of the week of the first day of the month System.out.printf("First day' weekday: %s/n", getFirstDayWeekday(cal) ); // Get the week of the last day of the current month System.out.printf("Last day' weekday : %s/n", getLastDayWeekday(cal) ); // Get the week of the last day of the previous month System.out.printf("PrevMonth Last day' weekday: %s/n", getLastDayWeekdayOfPrevMonth(cal) ); // Get the week of the first day of the next month System.out.printf("NextMonth First day' weekday: %s/n", getFirstDayWeekdayOfNextMonth(cal) ); } /** * Get "year" * * @return For example, 2013-09-18, it returns 2013 */ public static int getYear(Calendar cal) { return cal.get(Calendar.YEAR); } /** * Get "month" * * @return The return value can be the following values: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER. * The first month of which is JANUARY, which is 0. * * For example, 2013-09-18, return 8 */ public static int getMonth(Calendar cal) { return cal.get(Calendar.MONTH); } /** * Get "Last month" * * @return The return value can be the following values: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER. * The first month of which is JANUARY, which is 0. * * For example, the last month of 2012-01-12 was "11" (i.e. DECEMBER). */ public static int getLastMonth(Calendar cal) { return (cal.get(Calendar.MONTH) + 11) % 12; } /** * Get "Next Month" * * @return The return value can be the following values: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER. * The first month of which is JANUARY, which is 0. * * For example, the next month on 2013-12-12 is "1" (i.e. DECEMBER). */ public static int getNextMonth(Calendar cal) { return (cal.get(Calendar.MONTH) + 13) % 12; } /** * Get "day" * * @return For example, 2013-09-18, it returns 18 * */ public static int getDay(Calendar cal) { return cal.get(Calendar.DATE); } /** * Get "days of this month" * * @return For example, 2013-09-18, it returns 30 * */ public static int getMonthDays(Calendar cal) { return cal.getActualMaximum(Calendar.DATE); } /** * Get "days in the previous month" * * @return For example, 2013-01-18, it returns 31 (because there are 31 days in 2012-12) * */ public static int getPrevMonthDays(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, cal tmpCal.add(Calendar.MONTH, -1); // Set to "Last month" return tmpCal.getActualMaximum(Calendar.DATE); } /** * Get "Number of days in the next month" * * @return For example, 2013-12-18, it returns 31 (because there are 31 days in 2014-01) * */ public static int getNextMonthDays(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.add(Calendar.MONTH, 1); // Set to "Next Month" return tmpCal.getActualMaximum(Calendar.DATE); } /** * Get the corresponding day of the week of Cal* * @return Return to "day of the week", which can be the following values: * SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY and SATURDAY. * SUNDAY is 1, MONDAY is 2, and so on. * For example, 2013-09-18 (Wednesday), return 4 */ public static int getWeekDay(Calendar cal) { return cal.get(Calendar.DAY_OF_WEEK); } /** * Get the corresponding day of the week on the first day of the month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getFirstDayWeekday(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.set(Calendar.DATE, 1); // Set the date to the first day of the month return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * Get the corresponding week day of the week on the last day of the current month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getLastDayWeekday(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.set(Calendar.DATE, 1); // Set the date to the first day of the month tmpCal.roll(Calendar.DATE, -1); // Set the date to the last day of the month return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * Get the week of the last day of the previous month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getLastDayWeekdayOfPrevMonth(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.set(Calendar.DATE, 1); // Set the date to the first day of the month tmpCal.add(Calendar.DATE, -1); // Set the date to the last day of the previous month return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * Get the week offset of the first day of the next month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getFirstDayWeekdayOfNextMonth(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.add(Calendar.MONTH, 1); // Set to "Next Month" tmpCal.set(Calendar.DATE, 1); // Set to "First Day" return tmpCal.get(Calendar.DAY_OF_WEEK); }}