Java - LocalDateTime from Epoch
Pendahuluan
Semenjak java.util.Date Deprecated, maka kita menggunakan package java.time dalam melakukan operasi untuk tipe data tanggal dan waktu.
Di dalam package java.time ini tersedia banyak fungsi yang terpisah, tergantung domain tanggal dan waktu yang kita pilih.
Lalu kita ini mau ngapain ?
Ada kebutuhan untuk mendapatkan object java.time.LocalDateTime dari data millisecond yang kita dapatkan.
Kenapa java.time.LocalDateTime ?
Ya karena hanya java.time.LocalDateTime yang merepresentasikan Tanggal dan Waktu yang direpresentasikan oleh epoch time yang kita dapatkan.
Misalnya bagaimana ?
Misalnya :
Kita ingin mendapatkan tanggal dan waktu dari nilai epoch karena :
- Data dari json yang dikirimkan memang hanya dalam bentuk millisecond.
- Data dari database yang tidak mendukung tipe data Date, Timestamp, seperti di DynamoDB AWS. Sehingga data timestamp disimpan dalam bentuk String atau Number dalam bentuk epoch time. Kita perlu mengubahnya ke dalam bentuk LocalDate, LocalDateTime, LocalTime agar bisa ditampilkan sesuai dengan keinginan.
- Data umum yang biasanya menyimpan data dalam bentuk epoch time.
Sementara kita membutuhkan data yang dimengerti oleh manusia, yaitu Tanggal, Waktu, Zona Waktu, dll.
Jadi ?
Tentu saja kita harus melakukan konversi dari epoch time ke java.time.LocalDateTime.
Ok, kita langsung saja ke code nya
Misalkan kita mau mensimulasikan pembuatan epoch time sbb :
1import java.time.ZonedDateTime;
2import java.time.format.DateTimeFormatter;
3
4public class CreateEpochTime {
5 public static void main(String args[]){
6 String strDate = "Sep 12 2021 07:11:52.454 UTC";
7 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss.SSS zzz");
8 ZonedDateTime zdt = ZonedDateTime.parse(strDate,dtf);
9 System.out.println(zdt.toInstant().toEpochMilli());
10 }
11}
Yang akan menghasilkan Tanggal dan Waktu Sep 12 2021 07:11:52.454 UTC dalam bentuk epoch / millisecond dengan nilai 1631430712454
1631430712454
Ini merupakan jumlah millisecond semenjak tanggal 1 Januari 1970.
Ok fine, lalu bagaimana mengubahnya menjadi LocalDateTime
Oke, ada 2 cara :
1. ubah ke object java.time.Instant, lalu ke java.time.LocalDateTime
Class java.time.Instant semirip dengan class java.util.Date dahulu, yang akhirnya Deprecated.
java.time.Instant menyimpan informasi tanggal dan waktu tertentu.
Cocok untuk menerima fungsi epoch time yang menyimpan data detik semenjak 1 Januari 1970.
Kemudian kita convert ke java.time.LocalDateTime dengan tambahan ZoneOffset.
Coba kita contohkan dalam code sbb :
1import java.time.Instant;
2import java.time.LocalDateTime;
3import java.time.ZoneOffset;
4
5public static void main(String args[]){
6 Instant instant = Instant.ofEpochMilli(1631430712454l);
7 System.out.println("Instant = " + instant);
8
9 LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);
10 System.out.println("LocalDateTime = " + localDateTime);
11}
dan hasilnya :
Instant = 2021-09-12T07:11:52.454Z
LocalDateTime = 2021-09-12T07:11:52.454
Dan perlu kita ketahui , bahwa Instant memiliki Zone Waktu, dengan default adalah ZoneOffset.UTC. Sementara LocalDateTime tidak mempunyai zone waktu.
Sehingga di hasil print variable diatas, Instan mempunyai ‘Z’ zone di akhirnya, sementara LocalDateTime tidak.
Apa yang perlu diperhatikan lagi ?
Dalam membuat Instant ada 3 method yang bisa digunakan :
- Instant.ofEpochMilli(1631430712454l); , ini yang kita pakai untuk epoch millisecond
- Instant.ofEpochSecond(1631430712l); , ini kalau dari second nya saja.
- Instant.ofEpochSecond(1631430712l, 454000000);, ini kalau menambahkan presisi sampai nanosecond.
Coba perhatikan ketiga method diatas, kita harus hati-hati menggunakannya.
Untuk Epoch dalam bentuk millisecond, maka kita menggunakan method yang pertama.
Kalau salah penggunaannya, maka hasilnya tentu saja akan berbeda.
2. ubah langsung ke object java.time.LocalDateTime
Mengubah epoch millisecond ke java.time.LocalDateTime bisa saja, memakai fungsi ofEpochSecond.
Ingat ya bukan millisecond, akan tetapi adalah second/detik.
Akibatnya kita juga harus hati-hati, parameter millisecond harus dibagi 1000 dahulu baru bisa dipassing untuk fungsi ini.
Fungsi ini juga membutuhkan inputan nanosecond , yang berarti kita harus mengambil 3 digit terakhir dari nilai epoch time inputan lalu dikali 1.000.000.
Coba kita contohkan dalam code sbb :
1import java.time.LocalDateTime;
2import java.time.ZoneOffset;
3
4public static void main(String args[]){
5 LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(1631430712l, 454000000, ZoneOffset.UTC);
6 System.out.println(localDateTime);
7}
kesimpulannya
Mengubah epoch time ke LocalDateTime adalah salah satu cara dalam mengubah representasi data waktu dari yang berorientasi teknis ke data yang bisa dibaca dengan mudah oleh manusia.
Caranya ada 2 :
- ubah ke object java.time.Instant, lalu ke java.time.LocalDateTime
- ubah langsung ke object java.time.LocalDateTime (tentunya dengan sedikit modifikasi)