Java - java.time
java.time
Package java.time diperkenalkan semenjak Java versi 8.
Package baru ini ditujukan untuk menggantikan package java.util.Date yang sebelumnya mempunyai permasalahan di sisi desain dan penggunaannya.
Detail permasalahan tentang java.util.Date ini bisa dilihat di Mengulik java.util.Date
Sejarah
java.util.Date mempunyai sejarah yang panjang sebelum diputuskan untuk membuat package baru untuk menggantikannya di Java versi 8.
java.util.Date yang tidak natural dan tidak bisa merepresentasikan kerumitan dalam membuat objek Date sesuai dengan kondisi di dunia nyata, membuat banyak orang membuat library baru untuk membantu mengatasi masalah itu, atau membuat class wrapper yang membantu Software Engineer untuk lebih mudah membuat objek Date/Time sesuai dengan kebutuhan di dunia nyata.
Salah satu contohnya adalah Joda Time, yang menjadi standar de facto sebelum Java 8 untuk merepresentasikan data Date / Time secara lebih lengkap.
Project java.time ini dimulai dengan inisiasi dari Stephen Colebourne , author dari library Joda Time untuk memperbaiki package java.util.Date dan java.util.Calendar untuk release Java versi 8.
Inisiatif ini dimasukkan sebagai Java Spesification Request 310 (JSR 310), yang ujung-ujungnya tim nya dikepalai oleh Stephen Colebourne juga.
Efeknya di package java.time ini, banyak yang mirip sekali dengan package di library Joda Time, walaupun ada beberapa yang tidak mirip juga.
Stephen Colebourne juga mengakui kalau di library Joda Time juga terdapat kesalahan desain yang kemudian diperbaiki di JSR 310 ini. Sumber.
Inisiatif memperbaiki package ini terjadi pada tahun 2007, sampai terjadi transisi Sun Microsystem diakuisi oleh Oracle pada April 2009. Dan akhirnya package java.time ini direlease di Java SE versi 8 pada 2014.
Perlu waktu 7 tahun untuk menyempurnakan ide tersebut dan menambahkannya ke library standar Java SE.
Hmmm…cukup panjang juga prosesnya ya…
Spesifikasinya
Ide dasarnya
Ada 3 dasar ide untuk membuat package ini :
1. Class untuk Date/Time mesti Immutable
Immutable berkaitan dengan objek yang tidak bisa dimodifikasi state nya setelah dibuat.
java.util.Date merupakan class yang bisa diubah nilai attributenya oleh Thread yang mengaksesnya.
Sehingga kalau ada beberapa objek/thread yang melakukan proses terhadap sebuah object java.util.Date, maka data objek java.util.Date bisa saja tidak konsisten, dan berubah-ubah tergantung kapan dan bagaimana masing-masing thread mengakses dan memodifikasi objek java.util.Date.
Contoh :
Misalnya class SimpleDateFormat(), yang melakukan format penulisan/tampilan terhadap objek java.util.Date.
package com.huzefril.example;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class PemrosesanDate {
public static void main(String[] args) {
DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
Date tanggal = new Date();
System.out.println(df.format(tanggal));
}
}
Code diatas hanya menggunakan satu Thread saja, dan tidak masalah. Tidak ada Thread lain yang akan mengakses nilai dari variable tanggal diatas.
Tetapi kalau terjadi kasus akses terhadap variable tanggal diatas oleh banyak Thread, dan masing-masing melakukan proses yang berbeda seperti ada pengubahan nilai tanggal, dll, maka ada kemungkinan nilai attribute di dalam java.util.Date berubah dan berada dalam state yang tidak konsisten.
Inilah yang disebut sebagai Not Thread Safe.
Oleh karena itu package java.time didesain dengan niatan awal semua class harus immutable dan harus dibuat dengan menggunakan cara fluent interface, yaitu dengan cara tidak menggunakan setter/getter biasa, tetapi dengan memanggil fungsi yang lebih memudahkan, intuitif, dan bisa diselipkan pengamanan didalamnya.
2. Memakai Domain Driven Design
Package java.time dibuat dengan niatan awal memisahkan bagian-bagian dari sistem penanggalan ke domain tersendiri.
Kalau kita lihat, ada beberapa komponen dalam penanggalan, misalnya :
- Tanggal, terdiri dari Tanggal, Bulan, dan Tahun.
- Waktu, terdiri dari Jam, Menit, Detik, Milidetik.
- Zona Waktu, seperti GMT+7, PT (Pacific Time), dll.
- Durasi, yang menunjukkan berapa perbedaan antara 2 tanggal.
- Kronologi, atau sistem penanggalan yang berbeda di beberapa tempat tertentu.
- dll.
Package java.time berusaha memisahkan komponen-komponen diatas di class-class terpisah.
Pemisahan ini lebih memudahkan untuk dibaca dan untuk diimplementasikan.
Efeknya juga dengan pemisahan ini adalah lebih mudah untuk dikustomisasi kalau ada perubahan dan perbaikan yang dilakukan nantinya.
3. Pemisahan Chronology atau Sistem Penanggalan per daerah khusus
Maksudnya API/package yang baru memungkinan orang untuk menggunakan sistem penanggalan khusus di beberapa negara di dunia.
Misalnya Jepang yang memiliki tahun yang berbeda dengan tahun Gregorian yang dipakai umum didunia.
Atau juga Thailand yang menggunakan Buddhist Calendar dimana tahunnya lebih dahulu 534 tahun dibandingkan tahun Gregorian.
Atau ada juga beberapa negara yang memakai standar penanggalan yang tidak umum, misalnya di Thailand menggunakan format D/M/YYYY, contohnya: 16/1/2564 , dimana kalau standar internasional adalah 16/01/2021.