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.

  • 🕒 Tanggal Warisan: Kelas java.util.Date menyimpan suatu momen dalam milidetik dan mencetak string default melalui metode toString.
  • 🔤 Huruf Pola: SimpleDateFormat menggunakan huruf-huruf seperti yyyy, MM, dd, HH, mm, ss, dan zzz untuk mendefinisikan format keluaran khusus.
  • Perbandingan: Metode compareTo mengembalikan bilangan bulat negatif, nol, atau positif untuk mengurutkan dua instance Date secara kronologis.
  • 🆕 API Modern: LocalDate, LocalDateTime, ZonedDateTime, dan Instant dalam java.time menggantikan Date dan Calendar dengan objek yang tidak dapat diubah (immutable).
  • 🧵 Keamanan Benang: DateTimeFormatter bersifat tetap dan aman untuk dibagikan, sedangkan SimpleDateFormat membutuhkan sinkronisasi atau pembungkus ThreadLocal.
  • 🔁 Interoperabilitas: Konversikan antara API lama dan baru menggunakan helper Date.toInstant, Date.from, dan Calendar.toInstant.

Java Tanggal dan Waktu

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.

Cara menggunakan Tanggal masuk Java

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:

SuratKomponen Tanggal atau WaktuExample
GPenunjuk zamanAD
yTahun2026
MBulan dalam tahunJuli atau Juli atau 07
wMinggu demi tahun27
WMinggu demi bulan2
DHari dalam setahun189
dHari dalam bulan10
FHari dalam seminggu dalam sebulan2
ENama hari dalam semingguSelasa atau Selasa
uJumlah hari dalam seminggu (1 = Monday, 7 = Minggu)1
aPenanda AM atau PMPM
HJam dalam sehari (0-23)0
kJam dalam sehari (1-24)24
KJam dalam AM atau PM (0-11)0
hJam dalam AM atau PM (1-12)12
mMenit demi jam30
sDetik dalam hitungan menit55
SMili detik978
zZona waktu (nama)Waktu Standar Pasifik; PST; GMT-08:00
ZZona waktu (selisih RFC 822)-0800
XZona 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:

  1. Format tanggal wajib: 2012.10.23 20:20:45 PSTPola format yang sesuai adalah yyyy.MM.dd HH:mm:ss zzz.
  2. 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

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:

  • LocalDate untuk tanggal tanpa waktu atau zona waktu (misalnya, hari ulang tahun).
  • LocalTime untuk tampilan waktu jam dinding tanpa tanggal atau zona waktu.
  • LocalDateTime untuk tanggal dan waktu tanpa zona waktu.
  • ZonedDateTime untuk tanggal dan waktu dengan zona waktu tertentu.
  • OffsetDateTime untuk tanggal dan waktu dengan offset UTC tetapi tanpa zona bernama.
  • Instant untuk stempel waktu mesin yang diukur dari epoch UNIX.
  • Duration ke Period untuk 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 ke DateTimeFormatter.
  • Selalu tentukan Lokal. Nama bulan dan hari berubah sesuai dengan lokal default JVM, yang membuat pola seperti MMM ke EEE Tidak portabel. Berikan locale secara eksplisit (misalnya, Locale.ENGLISH).
  • Sebutkan zona waktu secara eksplisit. LocalDateTime tidak memiliki zona, jadi ubah ke ZonedDateTime or Instant Kapan 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), dan calendar.toInstant().atZone(zone) di perbatasan antara kode lama dan kode modern.
  • Simpan stempel waktu dalam format UTC. Bertahanlah dan transmit tanggal dalam UTC (sebuah Instant atau string ISO 8601) dan konversikan ke zona pengguna hanya saat ditampilkan.

Pertanyaan Umum Demo Slot

Panggil LocalDateTime.now() dari paket java.time untuk tanggal dan waktu dalam zona sistem, atau LocalDate.now() untuk tanggal saja. Pada versi yang lebih lama JavaGunakan `new java.util.Date()` untuk mendapatkan waktu saat ini.

java.util.Date merepresentasikan suatu momen dalam milidetik sejak epoch dan bersifat mutable (dapat diubah). LocalDate memodelkan tanggal kalender tanpa waktu atau zona, bersifat immutable (tidak dapat diubah) dan thread-safe (aman untuk thread), serta menawarkan metode yang lebih jelas seperti plusDays dan isBefore.

Tidak. SimpleDateFormat menyimpan status parsing yang dapat diubah dan menghasilkan hasil yang salah ketika dibagikan antar thread. Bungkus dalam ThreadLocal, sinkronkan pada instance, atau beralih ke DateTimeFormatter, yang tidak dapat diubah dan aman.

Masukkan string persis “yyyy-MM-dd”. Huruf besar MM menunjukkan bulan, huruf kecil mm menunjukkan menit. Untuk tanggal dan waktu lengkap, gunakan “yyyy-MM-dd HH:mm:ss”. Selalu tentukan Lokal agar nama bulan tetap dapat direproduksi.

Dengan tipe data Date lama, gunakan compareTo yang mengembalikan nilai integer negatif, nol, atau positif. Dengan java.time, panggil isBefore, isAfter, atau isEqual pada LocalDate atau Instant. Kedua pendekatan tersebut menghormati urutan kronologis.

Panggil date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(). Untuk kembali ke tanggal sebelumnya, gunakan Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()). Pilih zona secara eksplisit setiap kali momen yang tepat penting.

Model AI yang dilatih pada korpus log dan dokumen menyimpulkan pola yang mungkin dari string sampel dan mengembalikan pola DateTimeFormatter yang sesuai. Klasifikasi pembelajaran mesin juga menandai bidang yang ambigu seperti urutan bulan-tanggal versus hari-bulan.

Ya. GitHub Copilot menyarankan pola DateTimeFormatter, konversi ZonedDateTime, dan JUnit pengujian untuk keluaran yang peka terhadap lokal. RevPeriksa setiap saran untuk memastikan huruf pola, lokal, dan zona waktu yang benar sebelum melakukan konfirmasi.

Ringkaslah postingan ini dengan: