1. Các vấn đề còn tồn động với Date Time trong Java.

Các class Java Date Time không nhất quán:
Chúng ta có class Date trong cả 2 package java.utiljava.sql trong class format/parse chúng lại nằm ở trong package java.text

  • java.util.Date bao gồm cả date và time trong khi java.sql.Date chỉ bao gồm date. Cả 2 class đều có cùng tên, đây là một thiết kế khá xấu.

  • Không rõ ràng trong việc định nghĩa các class cho time, timestamp, formatting và parsing.

  • Tất cả các class Date đều mutable do đó chúng ko an toàn khi dùng chung trong nhiều thread (not thread safe). Đây có thể coi là 1 vấn đề lớn với các class Java Date và Calendar.

  • Class Date không cung cấp internationalization và không hỗ trợ timezone, sau đó các class java.util.Calendarjava.util.TimeZone được giới thiệu nhưng chúng cũng gặp phải các vấn đề bên trên.

2. Những thay đổi về Date/Time trong Java 8

  • Khả năng mutable (Immutability): Tất cả các class trong Date Time API mới đều là immutable, điều này tốt cho môi trường multithreaded
  • Phân tách các mối quan tâm (Separation of Concerns): API mới phân chia rõ ràng giữa date time cho người đọc và date time cho máy đọc. Nó định nghĩa phân biết các class cho Date, Time, DateTime, Timestamp, Timezone…
  • Tính trong suốt (Clarity): Các method được định nghĩa 1 cách rõ ràng và thực thi các hành động giống nhau trong cùng 1 class. Ví dụ, để náy thời gian hiện tại ta có method now(), các method format()parse() đều được định nghĩa trong những class này.
  • Các tính năng hữu ích (Utility operations): Tất cả các class trong API Date Time đi kèm với các tác vụ phổ biến như cộng, trừ, parsing, định dạng date/time…
  • Khả năng mở rộng (Extendable): API Date Time mới làm việc theo chuẩn ISO-8601 calendar, tuy nhiên chúng ta vẫn có thể sử dụng nó với các chuẩn không phải ISO.

3. Các package của API Date Time Java 8

  • java.time Package: đây là 1 package chính của API Date Time. Nó gồm các class chính như LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration… Tất cả các class này đều là immutable và thread safe.
  • java.time.chrono Package: package gồm các generic API được định nghĩa cho các hệ thống có lịch không theo chuẩn ISO.Chúng ta có thể mở rộng classAbstractChronology để tạo Calendar riêng cho hệ thống của mình.
  • java.time.format Package: package này gồm các class sử dụng cho formatting và parsing
  • java.time.temporal Package: package gồm các object temporal và chúng ta có thể dùng chúng để lấy ngày cụ thể hoặc thời gian liên quan.
  • java.time.zone Package: package này gồm các class hỗ trợ các time zone khác nhau

4. Các ví dụ với API Date/Time Java 8

  • LocalDate: Tạo ra 1 instance của date theo tiêu chuẩn ISO 8601, không time, không timezone.
  • LocalTime: Tạo ra 1 instance của time theo tiêu chuẩn ISO 8601, không date, không timezone.
  • LocalDateTime: Nó bao gồm cả 2 API trên, tạo ra instance chứa cả date, time và không có timezone.
  • ZonedDateTime: Gồm API LocalDateTime có timezone
// lấy thời gian hiện tại bằng method now
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
ZonedDateTime zoneDateTime = ZonedDateTime.now();
System.out.println("localDate: "+ localDate);
System.out.println("localTime: "+ localTime);
System.out.println("localDateTime: "+ localDateTime);
System.out.println("zoneDateTime: "+ zoneDateTime);
// giảm đi 1 ngày trong localDate
localDate = localDate.minusDays(1);
System.out.println("localDate after minus: "+ localDate);
// công thêm 2 ngày vào localDate
localDate = localDate.plusDays(2);
System.out.println("localDate after plus: "+ localDate);
// tạo đối tượng LocalDate từ ngày chỉ rõ
LocalDate spec = LocalDate.of(2017, 11, 25);
System.out.println("spec: " + spec);
long days = ChronoUnit.DAYS.between(localDate, spec);
System.out.println("duration between localDate and spec is: " + days + "days");

Kết quả:

localDate: 2017-11-19
localTime: 21:18:45.934
localDateTime: 2017-11-19T21:18:45.934
zoneDateTime: 2017-11-19T21:18:45.934+07:00[Asia/Bangkok]
localDate after minus: 2017-11-18
localDate after plus: 2017-11-20
spec: 2017-11-25
duration between localDate and spec is: 5days

References:

https://www.journaldev.com/2800/java-8-date-localdate-localdatetime-instant

https://www.tutorialspoint.com/java8/java8_datetime_api.htm

Cám ơn bạn đã theo dõi!!!