Java Tanggal dan Waktu
⚡ Ringkasan Cerdas
Java Penanganan Tanggal dan Waktu menggabungkan kelas java.util.Date dan SimpleDateFormat lama dengan API java.time modern yang diperkenalkan pada Java 8, memberikan pengembang tipe data yang tidak dapat diubah dan aman untuk thread guna menghasilkan pekerjaan kalender yang akurat.

Menangani tanggal dan waktu di Java Ini adalah bagian rutin dalam membangun logika penjadwalan, mencatat stempel waktu, laporan, dan jejak audit. Sebelum menulis kode apa pun, ada baiknya mengetahui parameter yang membentuk suatu tanggal:
- The tahun (dalam dua atau empat digit).
- The bulan tersebut. (sebagai dua digit, sebagai tiga huruf pertama dari bulan, atau sebagai nama bulan lengkap).
- The tanggal (angka tanggal sebenarnya dalam bulan tersebut).
- The hari (nama hari pada tanggal yang diberikan, seperti Sun, Mon, Tue).
Java mengungkapkan banyak parameter lain yang menggambarkan suatu momen pada garis waktu, termasuk era, minggu dalam setahun, zona waktu, dan offset. Bagian di bawah ini membahas masing-masing parameter tersebut dengan contoh yang dapat dijalankan.
Tanggal Tampilan di Java
Java menyediakan Date kelas di java.util Paket ini menyimpan momen waktu tertentu dengan presisi milidetik dan menawarkan metode bantu untuk mencetak, membandingkan, dan memformat momen tersebut. Untuk mendapatkan tanggal dan waktu saat ini, buat instance kelas dengan konstruktor default-nya:
import java.util.Date; class Date_Ex1 { public static void main(String args[]) { // Instantiate a Date object by invoking its constructor Date objDate = new Date(); // Display the Date and Time using toString() System.out.println(objDate.toString()); } }
Keluaran:
Wed Nov 29 06:36:22 UTC 2017
Contoh tersebut mencetak tanggal dalam format toString default. Untuk menampilkan momen yang sama dalam pola yang berbeda, Anda perlu memahami terlebih dahulu huruf-huruf pemformatan yang Java menggunakan.
SimpleDateFormat: Mengurai dan Memformat Tanggal
The SimpleDateFormat kelas dalam java.text mengkonversi a Date mengubah objek menjadi string yang diformat dan mengurai string yang diformat tersebut kembali menjadi objek. Date. Ini menggunakan huruf pola yang dipetakan ke komponen tanggal atau waktu. Tabel di bawah ini mencantumkan setiap huruf yang didukung:
| Surat | Komponen Tanggal atau Waktu | Example |
|---|---|---|
| G | Penunjuk zaman | AD |
| y | Tahun | 2026 |
| M | Bulan dalam tahun | Juli atau Juli atau 07 |
| w | Minggu demi tahun | 27 |
| W | Minggu demi bulan | 2 |
| D | Hari dalam setahun | 189 |
| d | Hari dalam bulan | 10 |
| F | Hari dalam seminggu dalam sebulan | 2 |
| E | Nama hari dalam seminggu | Selasa atau Selasa |
| u | Jumlah hari dalam seminggu (1 = Monday, 7 = Minggu) | 1 |
| a | Penanda AM atau PM | PM |
| H | Jam dalam sehari (0-23) | 0 |
| k | Jam dalam sehari (1-24) | 24 |
| K | Jam dalam AM atau PM (0-11) | 0 |
| h | Jam dalam AM atau PM (1-12) | 12 |
| m | Menit demi jam | 30 |
| s | Detik dalam hitungan menit | 55 |
| S | Mili detik | 978 |
| z | Zona waktu (nama) | Waktu Standar Pasifik; PST; GMT-08:00 |
| Z | Zona waktu (selisih RFC 822) | -0800 |
| X | Zona waktu (selisih ISO 8601) | -08 atau -0800 atau -08:00 |
Anda tidak perlu menghafal seluruh tabel. Rujuklah tabel tersebut setiap kali Anda membuat pola baru.
Cara Menggunakan SimpleDateFormat
SimpleDateFormat adalah subkelas dari DateFormat Fitur ini memungkinkan Anda memformat dan mengurai tanggal menggunakan huruf pola di atas. Gabungkan huruf-huruf tersebut untuk menggambarkan string persis yang ingin Anda hasilkan atau baca.
Sebagai contoh:
- Format tanggal wajib: 2012.10.23 20:20:45 PSTPola format yang sesuai adalah
yyyy.MM.dd HH:mm:ss zzz. - Format tanggal wajib: 09:30:00 AM 23-May-2012Pola format yang sesuai adalah
hh:mm:ss a dd-MMM-yyyy.
olymp trade indonesiaTip: Perhatikan huruf besar dan kecil. M adalah bulan, huruf kecil m sangat kecil. Huruf besar H adalah jam 24 jam, huruf kecil h adalah jam 12 jam. Mencampuradukkan keduanya akan menghasilkan keluaran yang salah secara diam-diam.
Program di bawah ini mencetak tanggal saat ini dua kali, sekali dalam format default dan sekali melalui pola SimpleDateFormat:
import java.text.SimpleDateFormat; import java.util.Date; class TestDates_Format { public static void main(String args[]) { // Current system date and time is assigned to objDate Date objDate = new Date(); System.out.println(objDate); // Build the target pattern and format the date String strDateFormat = "hh:mm:ss a dd-MMM-yyyy"; SimpleDateFormat objSDF = new SimpleDateFormat(strDateFormat); System.out.println(objSDF.format(objDate)); } }
Keluaran:
Wed Nov 29 06:31:41 UTC 2017 06:31:41 AM 29-Nov-2017
Bandingkan Contoh Tanggal
Cara paling andal untuk memesan dua Date objek adalah compareTo() Metode ini mengembalikan bilangan bulat negatif jika pemanggil lebih awal, nol jika kedua waktu sama, dan bilangan bulat positif jika pemanggil lebih lambat. Cuplikan kode di bawah ini menguraikan dua string tanggal dan mencetak urutan relatifnya:
import java.text.SimpleDateFormat; import java.text.ParseException; import java.util.Date; class TestDates_Compare { public static void main(String args[]) throws ParseException { SimpleDateFormat objSDF = new SimpleDateFormat("dd-MM-yyyy"); Date dt_1 = objSDF.parse("20-08-1981"); Date dt_2 = objSDF.parse("12-10-2012"); System.out.println("Date1 : " + objSDF.format(dt_1)); System.out.println("Date2 : " + objSDF.format(dt_2)); // compareTo returns > 0 when dt_1 is after dt_2 if (dt_1.compareTo(dt_2) > 0) { System.out.println("Date 1 occurs after Date 2"); } // compareTo returns < 0 when dt_1 is before dt_2 else if (dt_1.compareTo(dt_2) < 0) { System.out.println("Date 1 occurs before Date 2"); } // compareTo returns 0 when both dates are equal else { System.out.println("Both are the same date"); } } }
Keluaran:
Date1 : 20-08-1981 Date2 : 12-10-2012 Date 1 occurs before Date 2
Catatan: Kode aslinya menggunakan pola tersebut. dd-mm-yyyyHuruf kecil mm Huruf tersebut menunjukkan menit, bukan bulan, sehingga parser secara diam-diam menghasilkan nilai bulan yang salah. Perbaikan di atas menggunakan huruf kapital. MM untuk bulan, huruf pola mana yang benar.
Java 8. API Tanggal dan Waktu Modern (java.time)
Java 8 memperkenalkan java.time Paket ini merupakan API yang didesain ulang dan terinspirasi oleh pustaka Joda-Time. Kelas-kelas baru ini bersifat immutable (tidak dapat diubah), thread-safe (aman untuk multi-threading), dan memisahkan kalender manusia dari garis waktu mesin. Tipe yang paling umum adalah:
LocalDateuntuk tanggal tanpa waktu atau zona waktu (misalnya, hari ulang tahun).LocalTimeuntuk tampilan waktu jam dinding tanpa tanggal atau zona waktu.LocalDateTimeuntuk tanggal dan waktu tanpa zona waktu.ZonedDateTimeuntuk tanggal dan waktu dengan zona waktu tertentu.OffsetDateTimeuntuk tanggal dan waktu dengan offset UTC tetapi tanpa zona bernama.Instantuntuk stempel waktu mesin yang diukur dari epoch UNIX.DurationkePerioduntuk jumlah berdasarkan waktu dan tanggal.
Contoh di bawah ini mencetak tanggal, waktu, stempel waktu, dan zona waktu saat ini menggunakan API modern:
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.time.Instant; import java.time.ZoneId; class ModernDateDemo { public static void main(String args[]) { LocalDate today = LocalDate.now(); LocalDateTime now = LocalDateTime.now(); ZonedDateTime zoned = ZonedDateTime.now(ZoneId.of("Asia/Kolkata")); Instant epoch = Instant.now(); System.out.println("LocalDate : " + today); System.out.println("LocalDateTime : " + now); System.out.println("ZonedDateTime : " + zoned); System.out.println("Instant : " + epoch); } }
Setiap tipe memiliki metode pabrik (now, of, parse) dan operasi yang tidak dapat diubah (plusDays, minusHours, withYear) yang mengembalikan nilai baru alih-alih mengubah objek aslinya.
DateTimeFormatter: Memformat Tanggal dalam Format Modern Java
DateTimeFormatter in java.time.format menggantikan SimpleDateFormatIa menggunakan gaya huruf pola yang sama, bersifat tetap (immutable), dan aman untuk dibagikan antar thread tanpa sinkronisasi tambahan. Kelas ini juga mengekspos konstanta siap pakai seperti... ISO_LOCAL_DATE ke ISO_ZONED_DATE_TIME untuk format standar.
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; class FormatterDemo { public static void main(String args[]) { LocalDateTime now = LocalDateTime.now(); DateTimeFormatter iso = DateTimeFormatter.ISO_LOCAL_DATE_TIME; DateTimeFormatter human = DateTimeFormatter.ofPattern("hh:mm:ss a dd-MMM-yyyy"); System.out.println(now.format(iso)); System.out.println(now.format(human)); LocalDateTime parsed = LocalDateTime.parse("2026-07-04T09:30:00", iso); System.out.println("Parsed back : " + parsed); } }
Untuk membandingkan dua tanggal di API modern, panggil isBefore, isAfter, atau isEqualMetode-metode ini terbaca lebih jelas daripada compareTo dan bekerja dengan setiap java.time kelas.
Keamanan Benang dan Praktik Terbaik untuk Java Tanggal dan Waktu
Kedua java.util.Date ke SimpleDateFormat mendahului perkembangan teknologi kontemporer modern Java, dan masing-masing memiliki kekurangan yang diketahui. Ikuti praktik di bawah ini untuk menjaga agar penanganan tanggal tetap benar dalam kode produksi:
- Lebih baik menggunakan java.time daripada Date dan Calendar. Tipe data baru ini bersifat tetap (immutable) dan aman untuk multi-threading (thread-safe), serta memodelkan domain dengan lebih akurat (tanggal tanpa waktu, waktu tanpa zona waktu, dan sebagainya).
- Jangan menggunakan SimpleDateFormat yang sama di beberapa thread. Kelas ini menyimpan status parsing internal dan tidak aman untuk multi-threading. Bungkuslah di dalam sebuah
ThreadLocal, sinkronkan pada instance, atau beralih keDateTimeFormatter. - Selalu tentukan Lokal. Nama bulan dan hari berubah sesuai dengan lokal default JVM, yang membuat pola seperti
MMMkeEEETidak portabel. Berikan locale secara eksplisit (misalnya,Locale.ENGLISH). - Sebutkan zona waktu secara eksplisit.
LocalDateTimetidak memiliki zona, jadi ubah keZonedDateTimeorInstantKapan pun momen yang tepat sangat penting, terutama untuk log, kolom basis data, dan muatan jaringan. - Konversikan antara kedua API tersebut dengan hati-hati. penggunaan
date.toInstant(),Date.from(instant), dancalendar.toInstant().atZone(zone)di perbatasan antara kode lama dan kode modern. - Simpan stempel waktu dalam format UTC. Bertahanlah dan transmit tanggal dalam UTC (sebuah
Instantatau string ISO 8601) dan konversikan ke zona pengguna hanya saat ditampilkan.


