1. Bertukar daripada Datekelas kepada Calendarkelas

Pengaturcara menyukai Datekelas kerana kesederhanaan dan sokongan untuk piawaian Unix, tetapi seperti yang anda tahu, setiap mawar mempunyai durinya.

Pengaturcara mahukan Datekelas "pintar". Dan mereka mendapat apa yang mereka mahu dalam bentuk kelas Calendar. Ia difikirkan sebagai cara untuk bukan sahaja menyimpan tarikh, tetapi juga untuk melakukan operasi sukar dengan tarikh.

Nama penuh kelas Calendarialah java.util.Calendar. Jangan lupa untuk menambahkannya pada pernyataan import jika anda memutuskan untuk menggunakannya dalam kod anda.

Anda boleh membuat Calendarobjek dengan arahan ini:

Calendar date = Calendar.getInstance();

Kaedah statik getInstance()kelas Calendarmencipta Calendarobjek yang dimulakan dengan tarikh semasa. Kalendar yang anda inginkan akan dibuat berdasarkan tetapan komputer yang menjalankan program.

Atau lebih tepat lagi, kalendar yang anda dapat... Itu kerana manusia di Bumi tidak terhad kepada satu kalendar. Sebaliknya, mereka menggunakan banyak. Dan hampir setiap daripada mereka dikaitkan dengan sesuatu agama atau negara. Kelas Calendarmenyokong 3 daripadanya:

Kalendar Penerangan
Kalendar Gregorian Kalendar Gregorian Kristian
Kalendar Buddha kalendar Buddha
Kalendar Imperial Jepun Kalendar empayar Jepun

Tetapi ada juga kalendar Cina dan Arab. Pada asasnya, bekerja dengan masa tidak semudah yang disangka.

Dalam kalendar Cina, tahun secara rasmi ialah 4716 pada masa penulisan pelajaran ini. Dan mengikut kalendar umat Islam, tahunnya ialah 1398. Selamat datang ke dunia besar, rakan pengaturcara saya.

2. Mencipta objek kalendar

Kami akan menggunakan kalendar Gregorian, kerana ia adalah yang paling biasa di dunia. Sekurang-kurangnya sehingga China membeli Oracle dan menjadikan kalendar Cina sebagai yang utama.

Anda boleh membuat objek kalendar dengan mana-mana tarikh menggunakan pernyataan seperti ini:

Calendar date = new GregorianCalendar(year, month, day);

Ya, anda perlu menulis GregorianCalendarsetiap masa. Sebaliknya Calendar, anda juga boleh menulis GregorianCalendar— itu juga akan berfungsi. Tetapi menulis hanya Calendarlebih pendek.

Tahun mesti ditulis sepenuhnya, cth anda tidak boleh menulis 19 berbanding 2019. Bulan masih dinomborkan dari sifar. Tetapi seperti sebelum ini, hari dalam bulan tidak dinomborkan dari sifar. Nerds!

Untuk menetapkan masa serta tarikh, anda perlu memasukkan masa sebagai hujah tambahan:

... = new GregorianCalendar(year, month, day, hours, minutes, seconds);

Anda juga boleh lulus dalam milisaat jika perlu. Mereka adalah parameter selepas bilangan saat.

3. Memaparkan objek kalendar pada skrin

Jika anda hanya mencetak objek kalendar pada skrin, anda tidak akan sangat berpuas hati dengan hasilnya.

Kod
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Output konsol
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Helsinki",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Europe/Helsinki,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

Perkara yang perlu diingat di sini ialah kalendar ialah kalendar, bukan tarikh : ia mempunyai semua jenis tetapan yang semuanya akan dipaparkan pada skrin.

Adalah wajar untuk menggunakan SimpleDateFormatobjek untuk memaparkan kalendar, tetapi sehingga kami mengkajinya, anda boleh menggunakan penggodaman hayat ini.

Date date = calendar.getTime();

Objek Calendarboleh ditukar dengan mudah kepada Dateobjek, dan anda sudah tahu cara memaparkan Dateobjek. Anda boleh menggunakan kod seperti ini untuk menukar Calendarobjek kepada Date:

Menggunakan getTime()kaedah:

Kod Output konsol
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Itu perkara yang agak berbeza, bukan?

4. Bekerja dengan unsur tarikh

Untuk mendapatkan elemen tertentu tarikh (cth. tahun, bulan, ...), kelas Calendarmempunyai get()kaedah. Ia adalah satu kaedah, tetapi ia mempunyai parameter:

int month = calendar.get(Calendar.MONTH);

Di mana calendarpembolehubah Calendar, dan MONTHmerupakan medan tetap kelas Calendar.

Anda lulus salah satu Calendarmedan tetap kelas sebagai hujah kepada getkaedah, dan anda mendapat nilai yang diingini sebagai hasilnya.

Contoh

Kod Penerangan
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


era (sebelum atau selepas era biasa)
tahun
bulan
hari bulan

hari minggu
jam
minit
saat

Untuk menukar elemen tarikh, gunakan setkaedah:

calendar.set(Calendar.MONTH, value);

Di mana calendarpembolehubah Calendar, dan MONTHmerupakan medan tetap kelas Calendar.

Apabila bekerja dengan setkaedah, anda lulus salah satu Calendarmedan tetap kelas sebagai argumen pertama, dan nilai baharu sebagai argumen kedua.

Contoh

Kod Penerangan
Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DAY_OF_MONTH, 4);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);

System.out.println(calendar.getTime());


tahun = 2019
bulan = Julai (bernombor dari 0)
hari ke-4
jam
minit
saat

5. Pemalar Calendarkelas

Medan tetap kelas Calendartidak terhad kepada bidang untuk menamakan elemen tarikh. Nampaknya ada medan untuk setiap kesempatan.

Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);

Sebagai contoh, terdapat medan tetap untuk merujuk kepada bulan:

Dan juga hari dalam seminggu:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("It's Friday");
}

Kami tidak akan menyenaraikan semuanya. Kami hanya tidak mahu anda terkejut jika anda melihat pemalar seperti ini dalam kod.

Menggunakan pemalar menjadikan kod lebih mudah dibaca, itulah sebabnya pengaturcara menggunakannya. Dan bulan dinomborkan dari sifar juga untuk meningkatkan kebolehbacaan. Atau tidak.

6. Menukar tarikh dalam Calendarobjek

Kelas Calendarmempunyai kaedah yang membolehkan anda beroperasi pada tarikh dengan cara yang lebih bijak. Sebagai contoh, anda boleh menambah setahun, sebulan atau beberapa hari pada tarikh. Atau bawa mereka pergi. Kaedah ini dipanggil add(). Bekerja dengannya kelihatan seperti ini:

calendar.add(Calendar.MONTH, value);

Di mana calendarpembolehubah Calendar, dan MONTHmerupakan medan tetap kelas Calendar.

Apabila bekerja dengan addkaedah, anda lulus salah satu Calendarmedan tetap kelas sebagai argumen pertama, dan sebagai argumen kedua — nilai baharu yang akan ditambah.

Ini adalah satu lagi kaedah pintar. Mari lihat betapa pintarnya:

Kod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Output konsol
Fri Mar 01 00:00:00 EET 2019

Kaedah ini difahamkan hanya ada 28 hari pada Februari 2019, jadi tarikh terhasil ialah 1 Mac.

Sekarang mari ambil 2 bulan! Apa yang patut kita dapat? 27 Disember 2018! Jom semak sekarang.

Untuk melaksanakan operasi yang menghasilkan tarikh yang lebih awal, anda perlu menghantar nilai negatif kepada add()kaedah:

Kod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Output konsol
Thu Dec 27 00:00:00 EET 2018

Ianya berfungsi!

Kaedah ini mengambil kira panjang bulan dan tahun lompat yang berbeza. Secara keseluruhannya, kaedah yang hebat. Itulah yang diperlukan oleh kebanyakan pengaturcara yang bekerja dengan tarikh.

7. Elemen bergolek kurma

Tetapi kadang-kadang terdapat situasi apabila kita tidak mahu tingkah laku pintar ini, contohnya anda ingin melakukan sesuatu pada satu bahagian tarikh tanpa mengubah segala-galanya.

Kelas Calendarmempunyai kaedah khas roll()untuk ini. Tandatangannya sama seperti add()kaedah, tetapi kaedah ini hanya mengubah satu elemen tarikh, meninggalkan yang lain tidak berubah.

Contoh:

Kod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Output konsol
Fri Dec 27 00:00:00 EET 2019

Kami menukar bulan, tetapi tahun dan tarikh kekal tidak berubah.