Fungsi Penanggalan dalam Program Java Menggunakan Class LocalDate

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 :

  1. Metode LocalDate.now(). Metode ini akan mengembalikan objek LocalDate yang merepresentasikan tanggal hari ini
  2. 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 objek LocalDate yang merepresentasikan tahun, bulan dan tanggal yang disebutkan
  3. Metode LocalDate.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
  4. 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 :

  1. Metode .getYear(). Metode ini akan mengembalikan informasi tahun dengan tipe integer
  2. Metode .getMonthValue() akan mengembalikan informasi bulan dengan tipe integer
  3. Metode .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
  4. Metode .getDayOfMonth() akan mengembalikan informasi tanggal dalam bulan dengan tipe integer
  5. Metode .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);
	}

}

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 :

  1. Metode 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).
  2. Metode 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
  3. Metode DateTimeFormatter.ofPattern(String pattern, Locale locale). Sama seperti metode .ofPattern() sebelumnya tetapi spesifik pada locale 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 :

  1. .plus(TemporalAmount amountToAdd) untuk mendapatkan tanggal yang akan datang (lihat dokumentasi).
  2. .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()
);