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.
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;
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 :
LocalDate.now()
. Metode ini akan mengembalikan objek LocalDate
yang merepresentasikan tanggal hari iniLocalDate.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 objek LocalDate
yang merepresentasikan tahun, bulan dan tanggal yang disebutkanLocalDate.parse(CharSequence text)
. Metode ini dipanggil dengan menyebutkan nilai parameter text
yaitu tanggal yang diinginkan dalam bentuk String. Teks tanggal dalam parameter harus ditulis dengan format tahun-bulan-tanggal
sebagai contoh 1971-05-12
LocalDate.parse(CharSequence text, DateTimeFormatter formatter)
. Sama seperti metode .parse()
sebelumnya. Yang membedakan, pada metode ini kita bisa menentukan sendiri format tanggal yang ingin digunakanSebagai 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"));
Objek LocalDate
menyimpan sejumlah informasi (yang umum dibutuhkan yaitu tanggal, bulan, dan tahun) yang dapat diakses menggunakan metode-metode objek berikut :
.getYear()
. Metode ini akan mengembalikan informasi tahun dengan tipe integer.getMonthValue()
akan mengembalikan informasi bulan dengan tipe integer.getMonth()
akan mengembalikan informasi bulan dengan tipe Month
. Class Month
terdapat pada paket java.time
, class ini akan berguna jika kita membutuhkan nama bulan dari objek LocalDate
.getDayOfMonth()
akan mengembalikan informasi tanggal dalam bulan dengan tipe integer.getDayOfWeek()
akan mengembalikan informasi hari dalam minggu dengan tipe DayOfWeek
. Class DayOfWeek
juga terdapat pada paket java.time
, class ini akan berguna jika kita membutuhkan nama hari dari objek LocalDate
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);
}
}
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 :
DateTimeFormatter.ofLocalizedDate(FormatStyle dateStyle)
. Metode ini akan mengembalikan objek DateTimeFormatter
dengan format tanggal berpatokan pada nilai enumerasi FormatStyle
yaitu FULL
, LONG
, MEDIUM
dan SHORT
(lihat dokumentasi).DateTimeFormatter.ofPattern(String pattern)
. Metode ini akan mengembalikan objek DateTimeFormatter
menggunakan format tanggal sebagaimana ditentukan pada pattern
(pola tanggal). Argument pattern
sendiri adalah rangkaian huruf dan simbol yang memiliki arti masing-masing, Sebagai contoh, dd/MMMM/yyyy
akan memformat tanggal 1981-01-03
menjadi 03/January/1981
DateTimeFormatter.ofPattern(String pattern, Locale locale)
. Sama seperti metode .ofPattern()
sebelumnya tetapi spesifik pada locale
yang ditentukanPerhatikan contoh berikut :
DateTimeFormatter fmt = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
LocalDate date = LocalDate.parse("2001-11-09");
System.out.println(date.format(fmt));
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
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()
);