Lớp java.time.LocalDateTime

Lớp LocalDateTime trong gói java.time của Java được sử dụng để biểu diễn biểu diễn cả ngày và giờ, bao gồm ngày tháng năm và thời gian trong ngày, theo lịch ISO-8601, ví dụ như "2007-12-03T10:15:30". Nó là một đối tượng ngày giờ không đổi (immutable) và lưu trữ thông tin ngày, tháng, năm, giờ, phút, giây, thậm chí có thể chính xác đến nano giây. Bên cạnh đó, LocalDateTime cũng cung cấp các phương thức để truy cập các trường ngày giờ khác như ngày trong năm, ngày trong tuần và tuần trong năm.

Ⅰ. Đặc điểm của lớp LocalDateTime

Không lưu trữ hoặc biểu diễn múi giờ.

Kết hợp ngày (giống LocalDate) với thời gian trong ngày (giống LocalTime).

Thích hợp để lưu trữ các ngày giờ cụ thể, chẳng hạn như ngày giờ sinh nhật với thời gian cụ thể.

Không thể biểu diễn một thời điểm cụ thể trên dòng thời gian mà cần thêm thông tin như sự lệch chuẩn hoặc múi giờ.

Sử dụng lịch ISO-8601.

Là lớp bất biến (immutable), các phép toán dựa trên sự so sánh bằng (==) hoặc sử dụng hash code không nên được áp dụng cho LocalDateTime. Bạn nên sử dụng phương thức equals để so sánh hai ngày giờ.

An toàn cho nhiều luồng (thread-safe).

Tóm lại, LocalDateTime là một lớp hữu ích để làm việc với ngày giờ cụ thể theo lịch ISO-8601 mà không cần quan tâm đến múi giờ.

Ⅱ. Khai báo lớp LocalDateTime trong Java

Để sử dụng lớp LocalDateTime và các lớp khác trong gói java.time, bạn cần thêm câu lệnh import vào đầu file Java của mình.

Cú pháp câu lệnh import:

Cú pháp

import java.time.LocalDateTime;

Cú pháp khai báo lớp LocalDateTime:

Cú pháp

public final class LocalDateTime
extends Object
implements Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable

Dưới đây là giải thích chi tiết về cú pháp khai báo này:

↳ public: Lớp này có thể được truy cập từ bất kỳ đâu trong chương trình, không bị giới hạn phạm vi.

↳ final: Lớp này không thể bị kế thừa. Điều này có nghĩa là bạn không thể tạo một lớp con từ LocalDateTime.

↳ class LocalDateTime: Khai báo một lớp có tên là LocalDateTime.

↳ extends Object: Tất cả các lớp trong Java đều kế thừa từ lớp Object (lớp gốc của tất cả các lớp trong Java). Việc này cho phép lớp LocalDateTime kế thừa các phương thức cơ bản từ Object, chẳng hạn như toString(), equals(), và hashCode().

implements Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable

Lớp LocalDateTime thực hiện (implements) các giao diện implements Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable. Điều này có nghĩa là lớp LocalDateTime phải cung cấp các phương thức được khai báo trong những giao diện này.

↳ implements Temporal: Lớp LocalDateTime thực hiện giao diện Temporal, cho phép nó tham gia vào các phép toán liên quan đến thời gian và ngày tháng, như điều chỉnh thời gian và so sánh với các giá trị thời gian khác.

↳ implements TemporalAdjuster: Lớp LocalDateTime thực hiện giao diện TemporalAdjuster, cho phép nó điều chỉnh đối tượng LocalDateTime theo các yêu cầu cụ thể, ví dụ như thêm một ngày, hoặc thay đổi thời gian theo các điều kiện nhất định.

↳ implements ChronoLocalDateTime<LocalDate>: Lớp LocalDateTime thực hiện giao diện ChronoLocalDateTime với kiểu tham số là LocalDate. Điều này có nghĩa là LocalDateTime kết hợp ngày và giờ và là một phần của hệ thống thời gian được chuẩn hóa trong java.time.

↳ implements Serializable: Lớp LocalDateTime thực hiện giao diện Serializable, cho phép các đối tượng LocalDateTime được chuyển đổi thành một chuỗi byte để lưu trữ hoặc truyền qua mạng. Việc này cho phép bạn ghi đối tượng LocalDateTime vào một luồng hoặc lưu trữ nó trong một tệp.

Ⅲ. Các phương thức của lớp LocalDateTime

Lớp LocalDateTime cung cấp các phương thức hữu ích để thao tác với ngày giờ. Việc phân nhóm các phương thức theo chức năng sẽ giúp bạn hiểu rõ hơn về cách sử dụng lớp LocalDateTime. Dưới đây là cách phân nhóm các phương thức phổ biến của lớp LocalDateTime:

Tạo đối tượng LocalDateTime

↳ now(): Lấy ngày giờ hiện tại của hệ thống.

↳ of(LocalDate date, LocalTime time): Tạo một đối tượng LocalDateTime từ một ngày và một thời gian cụ thể.

Dưới đây là ví dụ về cách sử dụng hai phương thức của lớp LocalDateTime trong Java: of(LocalDate date, LocalTime time) và now(). Ví dụ này sẽ tạo một đối tượng LocalDateTime từ một ngày và một thời gian cụ thể, và lấy ngày giờ hiện tại của hệ thống.

Ví dụ: Example.java

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class Example {
    public static void main(String[] args) {
        // Tạo đối tượng LocalDate
        LocalDate date = LocalDate.of(2024, 7, 22); // 2024-07-22
        
        // Tạo đối tượng LocalTime
        LocalTime time = LocalTime.of(14, 30, 15); // 14:30:15
        
        // Tạo đối tượng LocalDateTime từ LocalDate và LocalTime
        LocalDateTime dateTime = LocalDateTime.of(date, time); // 2024-07-22T14:30:15
        
        // Lấy ngày giờ hiện tại của hệ thống
        LocalDateTime currentDateTime = LocalDateTime.now();
        
        // In kết quả ra màn hình
        System.out.println("LocalDateTime được tạo từ ngày và giờ: " + dateTime);
        System.out.println("LocalDateTime hiện tại: " + currentDateTime);
    }
}

Kết quả của chương trình là:

LocalDateTime được tạo từ ngày và giờ: 2024-07-22T14:30:15
LocalDateTime hiện tại: 2024-07-22T17:21:06.701372500

Trong ví dụ này, phương thức of(LocalDate date, LocalTime time) được sử dụng để tạo một đối tượng LocalDateTime từ một ngày và thời gian cụ thể, và phương thức now() được sử dụng để lấy ngày giờ hiện tại của hệ thống. Hy vọng ví dụ này giúp bạn hiểu cách sử dụng các phương thức này trong Java!

Truy xuất thông tin

↳ get(TemporalField field): Lấy giá trị của một trường ngày giờ cụ thể (ví dụ: năm, tháng, ngày, giờ, phút, giây).

Dưới đây là ví dụ về cách sử dụng phương thức get(TemporalField field) của lớp LocalDateTime để truy xuất thông tin cụ thể như năm, tháng, ngày, giờ, phút, và giây. Ví dụ này tạo một đối tượng LocalDateTime, sau đó sử dụng phương thức get(TemporalField field) để lấy các thông tin ngày giờ khác nhau.

Ví dụ: Example.java

import java.time.LocalDateTime;
import java.time.temporal.ChronoField;

public class Example {
    public static void main(String[] args) {
        // Tạo một đối tượng LocalDateTime
        LocalDateTime dateTime = LocalDateTime.of(2024, 7, 22, 14, 30, 15);
        
        // Lấy thông tin năm, tháng, ngày, giờ, phút, giây
        int year = dateTime.get(ChronoField.YEAR);
        int month = dateTime.get(ChronoField.MONTH_OF_YEAR);
        int dayOfMonth = dateTime.get(ChronoField.DAY_OF_MONTH);
        int hour = dateTime.get(ChronoField.HOUR_OF_DAY);
        int minute = dateTime.get(ChronoField.MINUTE_OF_HOUR);
        int second = dateTime.get(ChronoField.SECOND_OF_MINUTE);
        
        // In kết quả ra màn hình
        System.out.println("Năm: " + year);
        System.out.println("Tháng: " + month);
        System.out.println("Ngày của tháng: " + dayOfMonth);
        System.out.println("Giờ: " + hour);
        System.out.println("Phút: " + minute);
        System.out.println("Giây: " + second);
    }
}

Kết quả của chương trình là:

Năm: 2024
Tháng: 7
Ngày của tháng: 22
Giờ: 14
Phút: 30
Giây: 15

Thay đổi giá trị

↳ plusDays(long days): Cộng thêm một số ngày vào ngày giờ hiện tại.

↳ minusDays(long days): Trừ đi một số ngày khỏi ngày giờ hiện tại.

Dưới đây là ví dụ về cách sử dụng hai phương thức plusDays(long days) và minusDays(long days) của lớp LocalDateTime để thay đổi giá trị của ngày giờ hiện tại. Ví dụ này sẽ tạo một đối tượng LocalDateTime, sau đó cộng thêm và trừ đi một số ngày từ đối tượng đó.

Ví dụ: Example.java

import java.time.LocalDateTime;

public class Example {
    public static void main(String[] args) {
        // Tạo một đối tượng LocalDateTime
        LocalDateTime originalDateTime = LocalDateTime.of(2024, 7, 22, 14, 30, 15);
        
        // Cộng thêm 5 ngày vào ngày giờ hiện tại
        LocalDateTime newDateTimePlusDays = originalDateTime.plusDays(5);
        
        // Trừ đi 3 ngày khỏi ngày giờ hiện tại
        LocalDateTime newDateTimeMinusDays = originalDateTime.minusDays(3);
        
        // In kết quả ra màn hình
        System.out.println("LocalDateTime gốc   : " + originalDateTime);
        System.out.println("Sau khi thêm 5 ngày: " + newDateTimePlusDays);
        System.out.println("Sau khi trừ 3 ngày: " + newDateTimeMinusDays);
    }
}

Kết quả của chương trình là:

LocalDateTime gốc : 2024-07-22T14:30:15
Sau khi thêm 5 ngày: 2024-07-27T14:30:15
Sau khi trừ 3 ngày: 2024-07-19T14:30:15

Trong ví dụ này, phương thức plusDays(long days) và minusDays(long days) cho phép bạn thay đổi ngày của đối tượng LocalDateTime một cách dễ dàng. Hy vọng ví dụ này giúp bạn hiểu cách sử dụng các phương thức này trong Java!

So sánh

↳ equals(Object obj): Kiểm tra xem hai đối tượng LocalDateTime có bằng nhau hay không.

Dưới đây là ví dụ về cách sử dụng phương thức equals(Object obj) của lớp LocalDateTime để kiểm tra xem hai đối tượng LocalDateTime có bằng nhau hay không. Ví dụ này sẽ tạo hai đối tượng LocalDateTime, sau đó sử dụng phương thức equals() để so sánh chúng.

Ví dụ: Example.java

import java.time.LocalDateTime;

public class Example {
    public static void main(String[] args) {
        // Tạo hai đối tượng LocalDateTime
        LocalDateTime dateTime1 = LocalDateTime.of(2024, 7, 22, 14, 30, 15);
        LocalDateTime dateTime2 = LocalDateTime.of(2024, 7, 22, 14, 30, 15);
        LocalDateTime dateTime3 = LocalDateTime.of(2024, 7, 23, 10, 15, 30);
        
        // So sánh hai đối tượng LocalDateTime
        boolean isEqual1 = dateTime1.equals(dateTime2); // True
        boolean isEqual2 = dateTime1.equals(dateTime3); // False
        
        // In kết quả ra màn hình
        System.out.println("dateTime1 có bằng dateTime2 không: " + isEqual1);
        System.out.println("dateTime1 có bằng dateTime3 không: " + isEqual2);
    }
}

Kết quả của chương trình là:

dateTime1 có bằng dateTime2 không: true
dateTime1 có bằng dateTime3 không: false

Trong ví dụ này, phương thức equals(Object obj) được sử dụng để so sánh các đối tượng LocalDateTime và xác định xem chúng có bằng nhau hay không. Hy vọng ví dụ này giúp bạn hiểu cách sử dụng phương thức equals() trong lớp LocalDateTime!

Định dạng

↳ format(DateTimeFormatter formatter): Định dạng ngày giờ hiện tại theo một mẫu định dạng cho trước.

Dưới đây là ví dụ về cách sử dụng phương thức format(DateTimeFormatter formatter) của lớp LocalDateTime để định dạng ngày giờ hiện tại theo một mẫu định dạng cho trước. Ví dụ này sẽ tạo một đối tượng LocalDateTime, sau đó sử dụng phương thức format() để định dạng đối tượng đó theo mẫu định dạng được cung cấp bởi DateTimeFormatter.

Ví dụ: Example.java

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Example {
    public static void main(String[] args) {
        // Tạo một đối tượng LocalDateTime
        LocalDateTime dateTime = LocalDateTime.of(2024, 7, 22, 14, 30, 15);
        
        // Định dạng ngày giờ hiện tại theo một mẫu định dạng cho trước
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
        String formattedDateTime = dateTime.format(formatter);
        
        // In kết quả ra màn hình
        System.out.println("Định dạng LocalDateTime: " + formattedDateTime);
    }
}

Kết quả của chương trình là:

Định dạng LocalDateTime: 22-07-2024 14:30:15

Trong ví dụ này, phương thức format(DateTimeFormatter formatter) được sử dụng để định dạng đối tượng LocalDateTime theo một mẫu định dạng cụ thể. Hy vọng ví dụ này giúp bạn hiểu cách sử dụng phương thức format() trong lớp LocalDateTime!

Các ngoại lệ thường gặp khi sử dụng lớp LocalDateTime trong Java

Dưới đây là các ngoại lệ thường gặp và nguyên nhân của chúng:

Ngoại lệ DateTimeParseException

↳ Nguyên nhân: Xảy ra khi phân tích cú pháp chuỗi ngày giờ không đúng định dạng.

↳ Ví dụ: Khi cố gắng phân tích một chuỗi "2024-07-22 14:30" thành LocalDateTime mà không có giây, nhưng định dạng mong đợi phải có giây.

Ngoại lệ DateTimeException

↳ Nguyên nhân: Xảy ra khi các thao tác ngày giờ không hợp lệ.

↳ Ví dụ: Khi cố gắng tạo một LocalDateTime với ngày 32 của tháng hoặc tháng 13 trong năm.

Ngoại lệ UnsupportedTemporalTypeException

↳ Nguyên nhân: Xảy ra khi truy cập một trường thời gian không được hỗ trợ bởi LocalDateTime.

↳ Ví dụ: Khi cố gắng truy cập trường ChronoField.CLOCK_HOUR_OF_DAY từ một đối tượng LocalDateTime.

Ngoại lệ ArithmeticException

↳ Nguyên nhân: Xảy ra khi có phép tính số học không hợp lệ trong các thao tác ngày giờ.

↳ Ví dụ: Khi cộng hoặc trừ một khoảng thời gian quá lớn gây tràn số.

Lưu ý:

Khi làm việc với LocalDateTime, việc kiểm tra dữ liệu đầu vào và các thao tác ngày tháng là rất quan trọng để tránh các ngoại lệ. Sử dụng các khối try-catch để xử lý ngoại lệ và cung cấp thông báo lỗi hoặc xử lý các tình huống bất thường để làm cho ứng dụng của bạn ổn định và dễ duy trì hơn.

Câu Nói Truyền Cảm Hứng

“Bắt đầu ở đâu không quan trọng, quan trọng là bạn sẵn sàng bắt đầu.” – W. Clement Stone

Không Gian Tích Cực

“Chúc bạn luôn giữ vững niềm tin và sức mạnh để vượt qua mọi thử thách trong cuộc sống.”