1. Beralih dari Datekelas ke Calendarkelas

Pemrogram menyukai Datekelas ini karena kesederhanaannya dan dukungannya untuk standar Unix, tetapi seperti yang Anda ketahui, setiap mawar memiliki duri.

Pemrogram menginginkan Datekelas "pintar". Dan mereka mendapatkan apa yang mereka inginkan dalam bentuk kelas Calendar. Itu disusun sebagai cara untuk tidak hanya menyimpan tanggal, tetapi juga untuk melakukan operasi yang sulit dengan tanggal.

Nama lengkap kelasnya Calendaradalah java.util.Calendar. Jangan lupa untuk menambahkannya ke import statement jika Anda memutuskan untuk menggunakannya dalam kode Anda.

Anda dapat membuat Calendarobjek dengan perintah ini:

Calendar date = Calendar.getInstance();

Metode statis getInstance()kelas Calendarmembuat Calendarobjek yang diinisialisasi dengan tanggal saat ini. Kalender yang Anda inginkan akan dibuat berdasarkan pengaturan komputer yang menjalankan program.

Atau lebih tepatnya, kalender yang Anda dapatkan... Itu karena manusia di Bumi tidak terbatas pada satu kalender. Sebaliknya, mereka menggunakan banyak. Dan hampir setiap dari mereka dikaitkan dengan beberapa agama atau negara. Kelas Calendarmendukung 3 di antaranya:

Kalender Keterangan
Kalender Gregorian Kalender Masehi Masehi
Kalender Buddhis kalender Buddha
Kalender Kekaisaran Jepang Kalender kekaisaran Jepang

Namun ada juga kalender Cina dan Arab. Pada dasarnya, bekerja dengan waktu tidak semudah kelihatannya.

Dalam penanggalan Tionghoa, tahun resminya adalah 4716 pada saat penulisan pelajaran ini. Dan menurut penanggalan Islam, tahunnya adalah 1398. Selamat datang di dunia besar sobat programmer.

2. Membuat objek kalender

Kami akan menggunakan kalender Gregorian, karena ini yang paling umum di dunia. Setidaknya sampai China membeli Oracle dan menjadikan kalender China sebagai yang utama.

Anda dapat membuat objek kalender dengan tanggal apa pun menggunakan pernyataan seperti ini:

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

Ya, Anda harus menulis GregorianCalendarsetiap saat. Alih-alih Calendar, Anda juga dapat menulis GregorianCalendar— itu juga akan berhasil. Tapi menulis saja Calendarlebih singkat.

Tahun harus ditulis lengkap, misal tidak bisa tulis 19 malah 2019. Bulan tetap angka dari nol. Tapi seperti sebelumnya, hari dalam sebulan tidak dihitung dari nol. Nerd!

Untuk menyetel waktu dan tanggal, Anda harus memasukkan waktu sebagai argumen tambahan:

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

Anda bahkan dapat mengirimkan dalam milidetik jika diperlukan. Mereka adalah parameter setelah jumlah detik.

3. Menampilkan objek kalender di layar

Jika Anda hanya mencetak objek kalender di layar, Anda tidak akan terlalu senang dengan hasilnya.

Kode
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Keluaran 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=?]

Hal yang perlu diingat di sini adalah kalender adalah kalender, bukan tanggal : ia memiliki semua jenis pengaturan yang semuanya akan ditampilkan di layar.

Sebaiknya gunakan SimpleDateFormatobjek untuk menampilkan kalender, tetapi sampai kita mempelajarinya, Anda dapat menggunakan life hack ini.

Date date = calendar.getTime();

Objek Calendardapat dengan mudah diubah menjadi Dateobjek, dan Anda sudah tahu cara menampilkan Dateobjek. Anda dapat menggunakan kode seperti ini untuk mengonversi Calendarobjek menjadi Date:

Menggunakan getTime()metode:

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

Itu masalah yang sangat berbeda, bukan?

4. Bekerja dengan elemen kencan

Untuk mendapatkan elemen tertentu dari suatu tanggal (misalnya tahun, bulan, ...), kelas Calendarmemiliki get()metode. Ini adalah metode tunggal, tetapi memiliki parameter:

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

Di mana calendarvariabel Calendar, dan MONTHmerupakan bidang konstanta kelas Calendar.

Anda meneruskan salah satu Calendarbidang konstanta kelas sebagai argumen ke getmetode, dan Anda mendapatkan nilai yang diinginkan sebagai hasilnya.

Contoh

Kode Keterangan
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 sesudah era umum)
tahun
bulan
hari bulan

hari minggu
jam
menit
detik

Untuk mengubah elemen tanggal, gunakan setmetode:

calendar.set(Calendar.MONTH, value);

Di mana calendarvariabel Calendar, dan MONTHmerupakan bidang konstanta kelas Calendar.

Saat bekerja dengan setmetode, Anda meneruskan salah satu Calendarbidang konstanta kelas sebagai argumen pertama, dan nilai baru sebagai argumen kedua.

Contoh

Kode Keterangan
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 = Juli (dinomori dari 0)
hari ke 4
jam
menit
detik

5. Konstanta Calendarkelas

Bidang konstanta kelas Calendartidak terbatas pada bidang penamaan elemen tanggal. Tampaknya ada bidang untuk setiap kesempatan.

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

Misalnya, ada bidang konstan untuk merujuk ke 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 mencantumkan semuanya. Kami hanya tidak ingin Anda terkejut jika melihat konstanta seperti ini dalam kode.

Menggunakan konstanta membuat kode lebih mudah dibaca, itulah sebabnya pemrogram menggunakannya. Dan bulan diberi nomor dari nol juga untuk meningkatkan keterbacaan. Atau tidak.

6. Mengubah tanggal pada suatu Calendarobjek

Kelas Calendarmemiliki metode yang memungkinkan Anda menjalankan kencan dengan cara yang lebih cerdas. Misalnya, Anda dapat menambahkan satu tahun, satu bulan, atau beberapa hari ke sebuah tanggal. Atau singkirkan mereka. Metode ini disebut add(). Bekerja dengannya terlihat seperti ini:

calendar.add(Calendar.MONTH, value);

Di mana calendarvariabel Calendar, dan MONTHmerupakan bidang konstanta kelas Calendar.

Saat bekerja dengan addmetode, Anda meneruskan salah satu Calendarbidang konstanta kelas sebagai argumen pertama, dan sebagai argumen kedua — nilai baru yang akan ditambahkan.

Ini adalah metode cerdas lainnya. Mari kita lihat seberapa pintar itu:

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

Metode ini memahami bahwa hanya ada 28 hari di bulan Februari 2019, sehingga tanggal yang dihasilkan adalah 1 Maret.

Sekarang mari kita ambil 2 bulan! Apa yang harus kita dapatkan? 27 Desember 2018! Mari kita periksa sekarang.

Untuk melakukan operasi yang menghasilkan tanggal lebih awal, Anda harus memberikan nilai negatif ke metode add():

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

Berhasil!

Metode ini memperhitungkan panjang bulan yang berbeda serta tahun kabisat. Semua dalam semua, metode yang bagus. Persis seperti yang dibutuhkan sebagian besar programmer yang bekerja dengan tanggal.

7. Elemen bergulir dari sebuah kencan

Namun terkadang ada situasi ketika kita tidak menginginkan perilaku cerdas ini, misalnya Anda ingin melakukan sesuatu pada satu bagian tanggal tanpa mengubah bagian lainnya.

Kelas Calendarmemiliki metode khusus roll()untuk ini. Tanda tangannya sama seperti add()metodenya, tetapi metode ini hanya mengubah satu elemen tanggal, sedangkan sisanya tidak berubah.

Contoh:

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

Kami mengubah bulan, tetapi tahun dan tanggal tetap tidak berubah.