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 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à:
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à:
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 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à:
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.