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:

text
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.999999999

Mari kita telaah baris-baris kode di atas:

  1. Baris 6-9: empat objek dibuat dari tingkat presisi berbeda; perhatikan bahwa overload keempat menerima nanodetik (500 berarti 500 nanodetik, bukan milidetik).
  2. Baris 16-19: method get membaca tiap komponen secara terpisah; getNano() mengembalikan komponen nanodetik dalam angka mentah 0 sampai 999.999.999.
  3. Baris 22-24: konstanta MIDNIGHT (00:00), NOON (12:00), dan MAX (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:

text
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:30

Baris 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 #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

ManipulasiLocalTime.java

Unduh berkas
java
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));
    }
}

MembuatLocalTime.java

Unduh berkas
java
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);
    }
}