Tulisan kali ini akan membahas tentang penggunaan class LocalDate
untuk fungsi penanggalan dalam program java. Class ini dapat digunakan untuk mendapatkan informasi tanggal yang kemudian dapat ditampilkan dalam format yang diinginkan.
Pengantar
Class LocalDate
terdapat pada modul/paket java.base/java.time
dimulai dari java versi 1.8 (lihat dokumentasi API). Untuk menggunakan class tersebut, kita perlu menyebutkan klausa import sebelum deklarasi class java.
import java.time.LocalDate;
Konstruksi Objek
Dikarenakan class LocalDate
tidak memiliki konstruktor publik, pembentukan objek hanya bisa dilakukan melalui beberapa metode statis. Metode-metode yang paling mudah digunakan adalah sebagai berikut :
- Metode
LocalDate.now()
. Metode ini akan mengembalikan objekLocalDate
yang merepresentasikan tanggal hari ini - Metode
LocalDate.of(int year, int month, int dayOfMonth)
. Metode.of()
dipanggil dengan menyebutkan 3 nilai parameter integer secara berurutan yaitu tahun, bulan, dan tanggal. Metode ini akan mengembalikan objekLocalDate
yang merepresentasikan tahun, bulan dan tanggal yang disebutkan - Metode
LocalDate.parse(CharSequence text)
. Metode ini dipanggil dengan menyebutkan nilai parametertext
yaitu tanggal yang diinginkan dalam bentuk String. Teks tanggal dalam parameter harus ditulis dengan formattahun-bulan-tanggal
sebagai contoh1971-05-12
- Metode
LocalDate.parse(CharSequence text, DateTimeFormatter formatter)
. Sama seperti metode.parse()
sebelumnya. Yang membedakan, pada metode ini kita bisa menentukan sendiri format tanggal yang ingin digunakan
Sebagai contoh :
LocalDate date1 = LocalDate.now();
LocalDate date2 = LocalDate.of(1981, 02, 14);
LocalDate date3 = LocalDate.parse("1971-05-12");
LocalDate date4 = LocalDate.parse("12/05/1971", DateTimeFormatter.ofPattern("dd/MM/yyyy"));
Mendapatkan Informasi Tanggal
Objek LocalDate
menyimpan sejumlah informasi (yang umum dibutuhkan yaitu tanggal, bulan, dan tahun) yang dapat diakses menggunakan metode-metode objek berikut :
- Metode
.getYear()
. Metode ini akan mengembalikan informasi tahun dengan tipe integer - Metode
.getMonthValue()
akan mengembalikan informasi bulan dengan tipe integer - Metode
.getMonth()
akan mengembalikan informasi bulan dengan tipeMonth
. ClassMonth
terdapat pada paketjava.time
, class ini akan berguna jika kita membutuhkan nama bulan dari objekLocalDate
- Metode
.getDayOfMonth()
akan mengembalikan informasi tanggal dalam bulan dengan tipe integer - Metode
.getDayOfWeek()
akan mengembalikan informasi hari dalam minggu dengan tipeDayOfWeek
. ClassDayOfWeek
juga terdapat pada paketjava.time
, class ini akan berguna jika kita membutuhkan nama hari dari objekLocalDate
Perhatikan contoh kode program berikut :
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;
public class ContohLocalDate1 {
public static void main(String[] args) {
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate localDate = LocalDate.parse("12/12/2012", fmt);
int tahun = localDate.getYear();
int bulan = localDate.getMonthValue();
int tanggal = localDate.getDayOfMonth();
System.out.println(String.format("Tahun : %d, Bulan : %d, Tanggal : %d", tahun, bulan, tanggal));
Month month = localDate.getMonth();
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
Locale idLocale = new Locale("id", "ID"); // locale indonesia
String namaBulan = month.getDisplayName(TextStyle.FULL, idLocale);
String namaHari = dayOfWeek.getDisplayName(TextStyle.FULL, idLocale);
System.out.println(String.format("%s, %d %s %d", namaHari, tanggal, namaBulan, tahun));
}
}
Program diatas akan mengembalikan output berikut :
Tahun : 2012, Bulan : 12, Tanggal : 12
Rabu, 12 Desember 2012
Cara lain untuk mendapatkan informasi dari objek LocalDate
adalah dengan menggunakan metode .get(TemporalField field)
. TemporalField
dalam metode tersebut adalah sebuah inteface dalam paket java.time.temporal
. Untuk memanggil metode .get()
, kita cukup gunakan implementasi dari TemporalField
. Salah satu yang cukup mudah digunakan adalah tipe enum ChronoField
yang berisi field-field umum untuk informasi tanggal.
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.format.TextStyle;
import java.time.temporal.ChronoField;
import java.util.Locale;
public class ContohLocalDate2 {
public static void main(String[] args) {
LocalDate date = LocalDate.parse("1945-08-17");
int year = date.get(ChronoField.YEAR);
int month = date.get(ChronoField.MONTH_OF_YEAR);
int dayOfMonth = date.get(ChronoField.DAY_OF_MONTH);
int dayOfWeek = date.get(ChronoField.DAY_OF_WEEK);
Locale idn = new Locale("id", "ID"); // locale indonesia
String monthName = Month.of(month).getDisplayName(TextStyle.FULL, idn);
String dayName = DayOfWeek.of(dayOfWeek).getDisplayName(TextStyle.FULL, idn);
String txt = String.format("%s, %d %s %d", dayName, dayOfMonth, monthName, year);
System.out.println(txt);
}
}
Menampilkan Tanggal Menggunakan Format Tertentu
Pada contoh sebelumnya, kita sudah mencoba menampilkan tanggal dengan cara mengambil informasi dari field-field dalam objek LocalDate
. Cara lain yang bisa kita gunakan untuk menampilkan tanggal adalah dengan menggunakan metode objek .format(DateTimeFormatter formatter)
. Class DateTimeFormatter
dalam metode tersebut terdapat pada paket java.time.format
(lihat dokumentasi), class ini menyediakan fungsi formatting untuk objek-objek tanggal dan waktu.
Objek DateTimeFormatter
didapatkan melalui pemanggilan salah satu metode statis yang disediakan dalam class tersebut, berikut ini adalah beberapa metode yang cukup mudah digunakan :
- Metode
DateTimeFormatter.ofLocalizedDate(FormatStyle dateStyle)
. Metode ini akan mengembalikan objekDateTimeFormatter
dengan format tanggal berpatokan pada nilai enumerasiFormatStyle
yaituFULL
,LONG
,MEDIUM
danSHORT
(lihat dokumentasi). - Metode
DateTimeFormatter.ofPattern(String pattern)
. Metode ini akan mengembalikan objekDateTimeFormatter
menggunakan format tanggal sebagaimana ditentukan padapattern
(pola tanggal). Argumentpattern
sendiri adalah rangkaian huruf dan simbol yang memiliki arti masing-masing, Sebagai contoh,dd/MMMM/yyyy
akan memformat tanggal1981-01-03
menjadi03/January/1981
- Metode
DateTimeFormatter.ofPattern(String pattern, Locale locale)
. Sama seperti metode.ofPattern()
sebelumnya tetapi spesifik padalocale
yang ditentukan
Perhatikan contoh berikut :
DateTimeFormatter fmt = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
LocalDate date = LocalDate.parse("2001-11-09");
System.out.println(date.format(fmt));
Mendapatkan Tanggal pada Periode Waktu Tertentu
Fungsi lain yang disediakan dalam LocalDate
adalah untuk mendapatkan tanggal setelah atau sebelum periode waktu tertentu. Sebagai contoh, semisal kita ingin mengetahui tanggal dalam periode 1 tahun, 3 bulan dan 10 hari yang akan datang (atau sebaliknya) sejak hari ini.
Untuk fungsi ini kita bisa gunakan dua metode berikut :
.plus(TemporalAmount amountToAdd)
untuk mendapatkan tanggal yang akan datang (lihat dokumentasi)..minus(TemporalAmount amountToAdd)
untuk mendapatkan tanggal yang lalu (lihat dokumentasi).
Parameter TemporalAmount
pada kedua metode diatas adalah sebuah interface. Implementasi yang paling mudah digunakan dari interface tersebut adalah class Period
yang dapat dikonstruksikan dengan metode statis Period.of(int years, int months, int days)
.
Perhatikan contoh berikut :
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class ContohLocalDate4 {
public static void main(String[] args) {
Locale idn = new Locale("id", "ID");
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd MMMM yyyy", idn);
Period p = Period.of(1, 3, 10); // periode 1 tahun, 3 bulan, dan 10 hari
LocalDate hariIni = LocalDate.now();
LocalDate hariBerikut = hariIni.plus(p);
LocalDate hariLalu = hariIni.minus(p);
System.out.printf(
"Hari ini tanggal %s. %d tahun, %d bulan, dan %d hari yang akan datang sejak hari ini adalah %s\n",
hariIni.format(fmt), p.getYears(), p.getMonths(), p.getDays(), hariBerikut.format(fmt)
);
System.out.printf(
"Hari ini tanggal %s. %d tahun, %d bulan, dan %d hari yang lalu sejak hari ini adalah %s\n",
hariIni.format(fmt), p.getYears(), p.getMonths(), p.getDays(), hariLalu.format(fmt)
);
}
}
Program diatas akan menampilkan output seperti berikut :
Hari ini tanggal 30 Mei 2022. 1 tahun, 3 bulan, dan 10 hari yang akan datang sejak hari ini adalah 09 September 2023
Hari ini tanggal 30 Mei 2022. 1 tahun, 3 bulan, dan 10 hari yang lalu sejak hari ini adalah 18 Februari 2021
Mendapatkan Periode Waktu Antara Dua Tanggal
Sebelumnya kita telah mengetahui bagaimana mendapatkan tanggal berdasarkan periode waktu. Untuk pembahasan ini kita akan coba mendapatkan periode waktu antara dua tanggal. Sebagai contoh, kita ingin mengetahui berapa umur seseorang terhitung dari tanggal lahirnya sampai tanggal hari ini.
Untuk fungsi ini kita bisa gunakan metode .until(ChronoLocalDate endDateExclusive)
. Parameter ChronoLocalDate
pada metode tersebut adalah sebuah interface, dengan class implementasi LocalDate
. Parameter ini mengindikasikan tanggal batas akhir dari periode yang ingin didapatkan (lihat dokumentasi).
Perhatikan contoh kode program :
import java.time.format.DateTimeFormatter;
import java.time.LocalDate;
import java.time.Period;
import java.util.Locale;
public class ContohLocalDate5 {
public static void main(String[] args) {
Locale idn = new Locale("id", "ID");
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd MMMM yyyy", idn);
LocalDate birthDate = LocalDate.of(1998, 2, 18); // Tanggal lahir 18 Februari 1998
LocalDate todayDate = LocalDate.now(); // tanggal hari ini
Period p = birthDate.until(todayDate);
System.out.printf(
"Hari ini tanggal %s, jika anda lahir pada tanggal %s maka anda telah berumur %d tahun, %d bulan, dan %d hari",
todayDate.format(fmt), birthDate.format(fmt), p.getYears(), p.getMonths(), p.getDays()
);
}
}
Program tersebut akan menampilkan output sebagai berikut :
Hari ini tanggal 31 Mei 2022, jika anda lahir pada tanggal 18 Februari 1998 maka anda telah berumur 24 tahun, 3 bulan, dan 13 hari
Cara lain yang bisa digunakan adalah dengan memanggil metode statis Period.between(LocalDate startDateInclusive, LocalDate endDateExclusive)
.
Perhatikan contoh kode berikut ini :
Period p = Period.between(LocalDate.parse("1945-08-17"), LocalDate.now());
System.out.printf(
"Indonesia telah merdeka selama %d tahun, %d bulan dan %d hari",
p.getYears(), p.getMonths(), p.getDays()
);