Jika LocalDate menjawab kebutuhan “kapan saja tanggalnya”, ada pula kebutuhan sebaliknya: “jam berapa saja”, tanpa peduli tanggalnya. Jam buka toko, jadwal istirahat kantor, waktu mulai setiap sesi kelas, atau jam tayang rutin di televisi adalah data yang berulang setiap hari dan tidak terikat pada satu tanggal tertentu. LocalTime dari package java.time mewakili waktu dalam satu hari — jam, menit, detik, hingga nanodetik — tanpa komponen tanggal dan tanpa zona waktu. Pada Chapter ini kita pelajari pembuatan, pembacaan komponen, presisinya, serta operasi penjumlahan dan perbandingan waktu.
Membuat Objek LocalTime #
Factory method LocalTime.of() punya beberapa kelebihan beban (overload) sesuai tingkat presisi yang dibutuhkan: of(jam, menit), of(jam, menit, detik), dan of(jam, menit, detik, nanodetik). Method LocalTime.parse() membaca teks pada format ISO-8601 bawaan — HH:mm atau HH:mm:ss dengan jam 24 jam, bukan format AM/PM. Berbeda dari representasi lawas yang menyimpan milidetik tiga digit, LocalTime menyimpan komponen nanodetik sembilan digit, cukup untuk kebutuhan sistem presisi tinggi:
import java.time.LocalTime;
public class MembuatLocalTime {
public static void main(String[] args) {
LocalTime buka = LocalTime.of(8, 0); // jam, menit
LocalTime istirahat = LocalTime.of(12, 30, 15); // jam, menit, detik
LocalTime presisi = LocalTime.of(14, 30, 15, 500); // jam, menit, detik, nanodetik
LocalTime dariTeks = LocalTime.parse("08:30:15"); // format ISO-8601 bawaan
System.out.println("buka : " + buka);
System.out.println("istirahat : " + istirahat);
System.out.println("presisi : " + presisi);
System.out.println("dariTeks : " + dariTeks);
System.out.println("getHour() : " + istirahat.getHour());
System.out.println("getMinute() : " + istirahat.getMinute());
System.out.println("getSecond() : " + istirahat.getSecond());
System.out.println("getNano() : " + presisi.getNano());
// Konstanta siap pakai untuk batas hari.
System.out.println("MIDNIGHT : " + LocalTime.MIDNIGHT);
System.out.println("NOON : " + LocalTime.NOON);
System.out.println("MAX : " + LocalTime.MAX);
}
}Output yang Dihasilkan:
buka : 08:00
istirahat : 12:30:15
presisi : 14:30:15.000000500
dariTeks : 08:30:15
getHour() : 12
getMinute() : 30
getSecond() : 15
getNano() : 500
MIDNIGHT : 00:00
NOON : 12:00
MAX : 23:59:59.999999999Mari kita telaah baris-baris kode di atas:
- Baris 6-9: empat objek dibuat dari tingkat presisi berbeda; perhatikan bahwa overload keempat menerima nanodetik (
500berarti 500 nanodetik, bukan milidetik). - Baris 16-19: method
getmembaca tiap komponen secara terpisah;getNano()mengembalikan komponen nanodetik dalam angka mentah0sampai999.999.999. - Baris 22-24: konstanta
MIDNIGHT(00:00),NOON(12:00), danMAX(23:59:59.999999999) siap dipakai sebagai batas validasi atau perbandingan.
Perhatikan keluaran presisi: toString() milik LocalTime hanya mencetak komponen yang berbeda dari nol, sehingga nilai nanodetik tampil sebagai pecahan .000000500 di belakang detik. Representasi teks yang ringkas ini adalah format ISO-8601, bukan format tampilan pengguna akhir — untuk itu kita akan memakai DateTimeFormatter pada bab pemformatan.
Mengubah dan Membandingkan Waktu #
Seperti LocalDate, objek LocalTime immutable: plusMinutes, minusHours, dan withHour mengembalikan objek baru dan membiarkan objek asal tetap utuh. Perbandingan memakai isBefore dan isAfter mengikuti urutan waktu dalam satu hari, dan method format() mulai memperkenalkan kita pada pemformatan berpola:
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class ManipulasiLocalTime {
public static void main(String[] args) {
LocalTime mulai = LocalTime.of(8, 30);
// Semua operasi mengembalikan objek LocalTime yang baru.
LocalTime tambahP = mulai.plusMinutes(90);
LocalTime kurang = mulai.minusHours(1);
LocalTime ubahJam = mulai.withHour(20);
System.out.println("mulai : " + mulai);
System.out.println("plusMinutes(90) : " + tambahP);
System.out.println("minusHours(1) : " + kurang);
System.out.println("withHour(20) : " + ubahJam);
LocalTime batas = LocalTime.of(10, 0);
System.out.println("isBefore(batas) : " + mulai.isBefore(batas));
System.out.println("isAfter(batas) : " + mulai.isAfter(batas));
// Pergeseran melewati tengah malam berputar kembali ke awal hari.
LocalTime malam = LocalTime.of(23, 30);
System.out.println("23:30 + 60 menit : " + malam.plusMinutes(60));
DateTimeFormatter jamMenit = DateTimeFormatter.ofPattern("HH:mm");
System.out.println("format HH:mm : " + mulai.format(jamMenit));
}
}Output yang Dihasilkan:
mulai : 08:30
plusMinutes(90) : 10:00
minusHours(1) : 07:30
withHour(20) : 20:30
isBefore(batas) : true
isAfter(batas) : false
23:30 + 60 menit : 00:30
format HH:mm : 08:30Baris 8-10 menunjukkan tiga operasi — menambah 90 menit, mengurangi satu jam, dan mengganti komponen jam menjadi 20 — yang semuanya menghasilkan objek baru tanpa mengubah mulai. Baris 19-20 membandingkan 08:30 terhadap batas 10:00, dan baris 28-29 memformat objek menjadi teks 08:30 dengan pola HH:mm.
LocalDate dan LocalTime masing-masing menangani separuh informasi. Skenario nyata seperti “rapat dimulai 15 Januari 2026 pukul 08:00” membutuhkan keduanya sekaligus dalam satu nilai yang sahih — dan untuk itu java.time menyediakan LocalDateTime, bintang bab berikutnya.
Referensi #
- Oracle: Class LocalTime (Java SE 25 API)
- Oracle: Package java.time (Java SE 25 API)
- dev.java: Date Time
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
ManipulasiLocalTime.java
Unduh berkasimport java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class ManipulasiLocalTime {
public static void main(String[] args) {
LocalTime mulai = LocalTime.of(8, 30);
// Semua operasi mengembalikan objek LocalTime yang baru.
LocalTime tambahP = mulai.plusMinutes(90);
LocalTime kurang = mulai.minusHours(1);
LocalTime ubahJam = mulai.withHour(20);
System.out.println("mulai : " + mulai);
System.out.println("plusMinutes(90) : " + tambahP);
System.out.println("minusHours(1) : " + kurang);
System.out.println("withHour(20) : " + ubahJam);
LocalTime batas = LocalTime.of(10, 0);
System.out.println("isBefore(batas) : " + mulai.isBefore(batas));
System.out.println("isAfter(batas) : " + mulai.isAfter(batas));
// Pergeseran melewati tengah malam berputar kembali ke awal hari.
LocalTime malam = LocalTime.of(23, 30);
System.out.println("23:30 + 60 menit : " + malam.plusMinutes(60));
DateTimeFormatter jamMenit = DateTimeFormatter.ofPattern("HH:mm");
System.out.println("format HH:mm : " + mulai.format(jamMenit));
}
}
MembuatLocalTime.java
Unduh berkasimport java.time.LocalTime;
public class MembuatLocalTime {
public static void main(String[] args) {
LocalTime buka = LocalTime.of(8, 0); // jam, menit
LocalTime istirahat = LocalTime.of(12, 30, 15); // jam, menit, detik
LocalTime presisi = LocalTime.of(14, 30, 15, 500); // jam, menit, detik, nanodetik
LocalTime dariTeks = LocalTime.parse("08:30:15"); // format ISO-8601 bawaan
System.out.println("buka : " + buka);
System.out.println("istirahat : " + istirahat);
System.out.println("presisi : " + presisi);
System.out.println("dariTeks : " + dariTeks);
System.out.println("getHour() : " + istirahat.getHour());
System.out.println("getMinute() : " + istirahat.getMinute());
System.out.println("getSecond() : " + istirahat.getSecond());
System.out.println("getNano() : " + presisi.getNano());
// Konstanta siap pakai untuk batas hari.
System.out.println("MIDNIGHT : " + LocalTime.MIDNIGHT);
System.out.println("NOON : " + LocalTime.NOON);
System.out.println("MAX : " + LocalTime.MAX);
}
}