Lớp java.time.OffsetDateTime
Lớp OffsetDateTime trong gói java.time của Java được sử dụng để biểu diễn cả ngày tháng và thời gian có kèm theo độ lệch chuẩn so với Giờ Phối hợp Quốc tế (UTC) theo định dạng ISO-8601, ví dụ như "2007-12-03T10:15:30+01:00" (ngày 03 tháng 12 năm 2007, 10:15:30 giờ cộng thêm 1 giờ so với UTC). OffsetDateTime là một đối tượng ngày giờ bất biến (immutable) 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, cùng với độ lệch chuẩn tính theo giờ.
Ⅰ. Đặc điểm của lớp OffsetDateTime
↳ Lưu trữ cả ngày tháng (giống LocalDate) và thời gian (giống OffsetDateTime) kèm theo độ lệch chuẩn UTC.
↳ Thích hợp cho lưu trữ các ngày giờ cụ thể có múi giờ, chẳng hạn như thời gian đặt chuyến bay (bao gồm ngày giờ khởi hành và độ lệch chuẩn so với UTC).
↳ Có thể chuyển đổi tương đối dễ dàng sang ZonedDateTime (chiếc đồng hồ chứa thông tin múi giờ đầy đủ) hoặc Instant (thời điểm trên trục thời gian không phụ thuộc múi giờ).
↳ 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 OffsetDateTime. 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).
So sánh lớp OffsetDateTime với lớp Instant và lớp ZonedDateTime
↳ Lớp OffsetDateTime chi tiết hơn lớp Instant vì nó lưu trữ cả ngày tháng và thời gian, cùng với độ lệch chuẩn UTC.
↳ Lớp OffsetDateTime đơn giản hơn lớp ZonedDateTime vì nó không lưu trữ đầy đủ thông tin quy tắc múi giờ.
Tóm lại, lớp OffsetDateTime là một lớp hữu ích khi bạn cần lưu trữ ngày giờ có múi giờ nhưng không cần đến tất cả các chi tiết phức tạp của múi giờ (như lớp ZonedDateTime). Nó cung cấp sự cân bằng giữa lớp Instant ( đơn giản nhưng không có múi giờ) và lớp ZonedDateTime (chi tiết nhưng phức tạp).
Ⅱ. Khai báo lớp OffsetDateTime trong Java
Để sử dụng lớp OffsetDateTime 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.OffsetDateTime;
Cú pháp khai báo lớp OffsetDateTime:
Cú pháp
public final class OffsetDateTime
extends Object
implements Temporal, TemporalAdjuster, Comparable<OffsetDateTime>, 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ừ OffsetDateTime.
↳ class OffsetDateTime: Khai báo một lớp có tên là OffsetDateTime.
↳ 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 OffsetDateTime 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, Comparable<OffsetDateTime>, Serializable
Lớp OffsetDateTime thực hiện (implements) các giao diện implements Temporal, TemporalAdjuster, Comparable<OffsetDateTime>, Serializable. Điều này có nghĩa là OffsetDateTime 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 OffsetDateTime thực hiện giao diện Temporal, cho phép nó làm việc với các thao tác thời gian chung, như trích xuất các trường thời gian hoặc điều chỉnh thời gian.
↳ implements TemporalAdjuster: Lớp OffsetDateTime cũng thực hiện giao diện TemporalAdjuster, cho phép thực hiện các điều chỉnh thời gian, như thêm hoặc trừ thời gian.
↳ implements Comparable<OffsetDateTime>: Lớp OffsetDateTime thực hiện giao diện Comparable<OffsetDateTime>, cho phép so sánh đối tượng OffsetDateTime với các đối tượng khác cùng loại. Điều này có nghĩa là bạn có thể so sánh hai đối tượng OffsetDateTime để xác định thứ tự của chúng.
↳ implements Serializable: Lớp OffsetDateTime thực hiện giao diện Serializable, cho phép đối tượng OffsetDateTime được tuần tự hóa (serialized) và giải tuần tự hóa (deserialized). Điều này cần thiết khi đối tượng OffsetDateTime cần được ghi vào một luồng (stream) hoặc lưu trữ và phục hồi từ một nguồn khác, như tệp hoặc mạng.
Ⅲ. Các phương thức của lớp OffsetDateTime
Lớp OffsetDateTime cung cấp nhiều phương thức để thao tác với ngày giờ có độ lệch chuẩn UTC. 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 OffsetDateTime. Dưới đây là cách phân nhóm các phương thức phổ biến của lớp OffsetDateTime:
Tạo đối tượng OffsetDateTime
↳ now(): Lấy OffsetDateTime hiện tại từ hệ thống theo múi giờ mặc định.
↳ of(LocalDate date, LocalTime time, ZoneOffset offset): Tạo OffsetDateTime từ ngày (LocalDate), thời gian (LocalTime) và độ lệch chuẩn (ZoneOffset).
↳ ofInstant(Instant instant, ZoneId zone): Tạo OffsetDateTime từ thời điểm (Instant) và ID múi giờ (ZoneId).
↳ parse(CharSequence text): Chuyển đổi chuỗi văn bản sang
Dưới đây là ví dụ về cách sử dụng 4 phương thức để tạo đối tượng OffsetDateTime trong Java. Mỗi phương thức sẽ được trình bày trong cùng một lớp Java.
Ví dụ: Example.java
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class Example {
public static void main(String[] args) {
// 1. Tạo OffsetDateTime hiện tại từ hệ thống theo múi giờ mặc định.
OffsetDateTime now = OffsetDateTime.now();
System.out.println("OffsetDateTime hiện tại: " + now);
// 2. Tạo OffsetDateTime từ ngày (LocalDate), thời gian (LocalTime) và độ lệch chuẩn (ZoneOffset).
LocalDate date = LocalDate.of(2024, 7, 22);
LocalTime time = LocalTime.of(14, 30, 15);
ZoneOffset offset = ZoneOffset.ofHours(-5);
OffsetDateTime dateTimeFromComponents = OffsetDateTime.of(date, time, offset);
System.out.println("OffsetDateTime từ ngày, thời gian, và độ lệch chuẩn: " + dateTimeFromComponents);
// 3. Tạo OffsetDateTime từ thời điểm (Instant) và ID múi giờ (ZoneId).
Instant instant = Instant.now();
ZoneId zoneId = ZoneId.of("America/New_York");
OffsetDateTime dateTimeFromInstant = OffsetDateTime.ofInstant(instant, zoneId);
System.out.println("OffsetDateTime từ thời điểm và ID múi giờ: " + dateTimeFromInstant);
// 4. Chuyển đổi chuỗi văn bản sang OffsetDateTime.
String dateTimeString = "2024-07-22T14:30:15-05:00";
OffsetDateTime dateTimeFromString = OffsetDateTime.parse(dateTimeString, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
System.out.println("OffsetDateTime từ chuỗi văn bản: " + dateTimeFromString);
}
}
Kết quả của chương trình là:
OffsetDateTime từ ngày, thời gian, và độ lệch chuẩn: 2024-07-22T14:30:15-05:00
OffsetDateTime từ thời điểm và ID múi giờ: 2024-07-22T08:50:03.662901900-04:00
OffsetDateTime từ chuỗi văn bản: 2024-07-22T14:30:15-05:00
Những ví dụ trên cho thấy cách sử dụng các phương thức khác nhau để tạo và làm việc với đối tượng OffsetDateTime trong Java.
Lấy thông tin ngày tháng
↳ getDayOfMonth(): Lấy ngày trong tháng (1-31).
↳ getDayOfYear(): Lấy thứ tự của ngày trong năm (1-365/366).
↳ getDayOfWeek(): Lấy ngày trong tuần (DayOfWeek là một kiểu enum).
↳ getMonth(): Lấy tháng (Month là một kiểu enum).
↳ getMonthValue(): Lấy giá trị tháng (1-12).
↳ getYear(): Lấy năm.
Dưới đây là ví dụ về cách sử dụng các phương thức để lấy thông tin ngày tháng từ đối tượng OffsetDateTime trong Java.
Ví dụ: Example.java
import java.time.OffsetDateTime;
import java.time.DayOfWeek;
import java.time.Month;
public class Example {
public static void main(String[] args) {
// Tạo đối tượng OffsetDateTime
OffsetDateTime dateTime = OffsetDateTime.of(2024, 7, 22, 14, 30, 15, 123456789, ZoneOffset.ofHours(-5));
// Lấy ngày trong tháng (1-31)
int dayOfMonth = dateTime.getDayOfMonth();
System.out.println("Ngày trong tháng: " + dayOfMonth);
// Lấy thứ tự của ngày trong năm (1-365/366)
int dayOfYear = dateTime.getDayOfYear();
System.out.println("Thứ tự của ngày trong năm: " + dayOfYear);
// Lấy ngày trong tuần (DayOfWeek là một kiểu enum)
DayOfWeek dayOfWeek = dateTime.getDayOfWeek();
System.out.println("Ngày trong tuần: " + dayOfWeek);
// Lấy tháng (Month là một kiểu enum)
Month month = dateTime.getMonth();
System.out.println("Tháng: " + month);
// Lấy giá trị tháng (1-12)
int monthValue = dateTime.getMonthValue();
System.out.println("Giá trị tháng: " + monthValue);
// Lấy năm
int year = dateTime.getYear();
System.out.println("Năm: " + year);
}
}
Kết quả của chương trình là:
Thứ tự của ngày trong năm: 204
Ngày trong tuần: MONDAY
Tháng: JULY
Giá trị tháng: 7
Năm: 2024
Những ví dụ trên cho thấy cách sử dụng các phương thức để lấy thông tin về ngày tháng từ đối tượng OffsetDateTime.
Lấy thông tin thời gian
↳ getHour(): Lấy giờ trong ngày (0-23).
↳ getMinute(): Lấy phút (0-59).
↳ getSecond(): Lấy giây (0-59).
↳ getNano(): Lấy giá trị nano giây (0-999.999.999).
Dưới đây là ví dụ về cách sử dụng các phương thức để lấy thông tin thời gian từ đối tượng OffsetDateTime trong Java.
Ví dụ: Example.java
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
public class Example {
public static void main(String[] args) {
// Tạo đối tượng OffsetDateTime
OffsetDateTime dateTime = OffsetDateTime.of(2024, 7, 22, 14, 30, 15, 123456789, ZoneOffset.ofHours(-5));
// Lấy giờ trong ngày (0-23)
int hour = dateTime.getHour();
System.out.println("Giờ: " + hour);
// Lấy phút (0-59)
int minute = dateTime.getMinute();
System.out.println("Phút: " + minute);
// Lấy giây (0-59)
int second = dateTime.getSecond();
System.out.println("Giây: " + second);
// Lấy giá trị nano giây (0-999.999.999)
int nano = dateTime.getNano();
System.out.println("Nano giây: " + nano);
}
}
Kết quả của chương trình là:
Phút: 30
Giây: 15
Nano giây: 123456789
Các ví dụ trên cho thấy cách sử dụng các phương thức để lấy thông tin về thời gian từ đối tượng OffsetDateTime.
Lấy thông tin khác
↳ getOffset(): Lấy độ lệch chuẩn so với UTC.
↳ hashCode(): Trả về giá trị băm của OffsetDateTime hiện tại.
↳ toString(): Chuyển đổi OffsetDateTime sang chuỗi theo định dạng ISO-8601 (ví dụ: "2007-12-03T10:15:30+01:00").
Dưới đây là ví dụ về cách sử dụng các phương thức để lấy thông tin khác từ đối tượng OffsetDateTime trong Java
Ví dụ: Example.java
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
public class Example {
public static void main(String[] args) {
// Tạo đối tượng OffsetDateTime
OffsetDateTime dateTime = OffsetDateTime.of(2024, 7, 22, 14, 30, 15, 123456789, ZoneOffset.ofHours(-5));
// Lấy độ lệch chuẩn so với UTC
ZoneOffset offset = dateTime.getOffset();
System.out.println("Độ lệch chuẩn so với UTC: " + offset);
// Trả về giá trị băm của OffsetDateTime hiện tại
int hashCode = dateTime.hashCode();
System.out.println("Giá trị băm: " + hashCode);
// Chuyển đổi OffsetDateTime sang chuỗi theo định dạng ISO-8601
String isoString = dateTime.toString();
System.out.println("Chuỗi định dạng ISO-8601: " + isoString);
}
}
Kết quả của chương trình là:
Giá trị băm: -1205705714
Chuỗi định dạng ISO-8601: 2024-07-22T14:30:15.123456789-05:00
Các ví dụ trên cho thấy cách sử dụng các phương thức để lấy thông tin khác từ đối tượng OffsetDateTime, bao gồm độ lệch chuẩn, giá trị băm, và chuỗi định dạng ISO-8601.
So sánh
↳ isAfter(OffsetDateTime other): Kiểm tra xem OffsetDateTime hiện tại có muộn hơn đối tượng OffsetDateTime khác hay không.
↳ isBefore(OffsetDateTime other): Kiểm tra xem OffsetDateTime hiện tại có sớm hơn đối tượng OffsetDateTime khác hay không.
↳ isEqual(OffsetDateTime other): Kiểm tra xem OffsetDateTime hiện tại có bằng với đối tượng OffsetDateTime khác hay không.
Dưới đây là ví dụ về cách sử dụng các phương thức so sánh (isAfter, isBefore, isEqual) của lớp OffsetDateTime trong Java.
Ví dụ: Example.java
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
public class Example {
public static void main(String[] args) {
// Tạo hai đối tượng OffsetDateTime
OffsetDateTime dateTime1 = OffsetDateTime.of(2024, 7, 22, 14, 30, 15, 123456789, ZoneOffset.ofHours(-5));
OffsetDateTime dateTime2 = OffsetDateTime.of(2024, 7, 22, 10, 15, 30, 987654321, ZoneOffset.ofHours(-5));
// So sánh xem dateTime1 có muộn hơn dateTime2 không
boolean isAfter = dateTime1.isAfter(dateTime2);
System.out.println("dateTime1 có muộn hơn dateTime2 không? " + isAfter);
// So sánh xem dateTime1 có sớm hơn dateTime2 không
boolean isBefore = dateTime1.isBefore(dateTime2);
System.out.println("dateTime1 có sớm hơn dateTime2 không? " + isBefore);
// So sánh xem dateTime1 có bằng dateTime2 không
boolean isEqual = dateTime1.isEqual(dateTime2);
System.out.println("dateTime1 có bằng dateTime2 không? " + isEqual);
}
}
Kết quả của chương trình là:
dateTime1 có sớm hơn dateTime2 không? false
dateTime1 có bằng dateTime2 không? false
Các ví dụ trên cho thấy cách so sánh hai đối tượng OffsetDateTime để kiểm tra sự khác biệt về thời gian và độ lệch chuẩn giữa chúng.
Thêm/trừ thời gian
↳ plusDays(long days): Thêm một số ngày nhất định.
↳ minusDays(long days): Trừ đi một số ngày nhất định.
↳ plusHours(long hours): Thêm một số giờ nhất định.
↳ minusHours(long hours): Trừ đi một số giờ nhất định.
↳ plusMinutes(long minutes): Thêm một số phút nhất định.
↳ minusMinutes(long minutes): Trừ đi một số phút nhất định.
↳ plusNanos(long nanos): Thêm một số nano giây nhất định.
↳ minusNanos(long nanos): Trừ đi một số nano giây nhất định.
↳ plusMonths(long months): Thêm một số tháng nhất định.
↳ minusMonths(long months): Trừ đi một số tháng nhất định.
Dưới đây là ví dụ về cách sử dụng các phương thức cộng và trừ thời gian (plusDays, minusDays, plusHours, minusHours, plusMinutes, minusMinutes, plusNanos, minusNanos, plusMonths, minusMonths) của lớp OffsetDateTime trong Java. Tất cả các phương thức được sử dụng trong cùng một lớp Java.
Ví dụ: Example.java
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
public class Example {
public static void main(String[] args) {
// Tạo đối tượng OffsetDateTime ban đầu
OffsetDateTime originalDateTime = OffsetDateTime.of(2024, 7, 22, 14, 30, 15, 123456789, ZoneOffset.ofHours(-5));
// Thêm và trừ ngày
OffsetDateTime dateTimePlusDays = originalDateTime.plusDays(5);
OffsetDateTime dateTimeMinusDays = originalDateTime.minusDays(5);
// Thêm và trừ giờ
OffsetDateTime dateTimePlusHours = originalDateTime.plusHours(3);
OffsetDateTime dateTimeMinusHours = originalDateTime.minusHours(3);
// Thêm và trừ phút
OffsetDateTime dateTimePlusMinutes = originalDateTime.plusMinutes(10);
OffsetDateTime dateTimeMinusMinutes = originalDateTime.minusMinutes(10);
// Thêm và trừ nano giây
OffsetDateTime dateTimePlusNanos = originalDateTime.plusNanos(500000000); // Thêm 0.5 giây
OffsetDateTime dateTimeMinusNanos = originalDateTime.minusNanos(500000000); // Trừ 0.5 giây
// Thêm và trừ tháng
OffsetDateTime dateTimePlusMonths = originalDateTime.plusMonths(2);
OffsetDateTime dateTimeMinusMonths = originalDateTime.minusMonths(2);
// In kết quả
System.out.println("DateTime Gốc: " + originalDateTime);
System.out.println("Sau khi thêm 5 ngày: " + dateTimePlusDays);
System.out.println("Sau khi trừ 5 ngày: " + dateTimeMinusDays);
System.out.println("Sau khi cộng 3 tiếng: " + dateTimePlusHours);
System.out.println("Sau khi trừ 3 tiếng: " + dateTimeMinusHours);
System.out.println("Sau khi cộng 10 phút: " + dateTimePlusMinutes);
System.out.println("Sau khi trừ 10 phút: " + dateTimeMinusMinutes);
System.out.println("Sau khi thêm 500 triệu nano giây (0,5 giây): " + dateTimePlusNanos);
System.out.println("Sau khi trừ đi 500 triệu nano giây (0,5 giây): " + dateTimeMinusNanos);
System.out.println("Sau khi thêm 2 tháng: " + dateTimePlusMonths);
System.out.println("Sau khi trừ 2 tháng: " + dateTimeMinusMonths);
}
}
Kết quả của chương trình là:
Sau khi thêm 5 ngày: 2024-07-27T14:30:15.123456789-05:00
Sau khi trừ 5 ngày: 2024-07-17T14:30:15.123456789-05:00
Sau khi cộng 3 tiếng: 2024-07-22T17:30:15.123456789-05:00
Sau khi trừ 3 tiếng: 2024-07-22T11:30:15.123456789-05:00
Sau khi cộng 10 phút: 2024-07-22T14:40:15.123456789-05:00
Sau khi trừ 10 phút: 2024-07-22T14:20:15.123456789-05:00
Sau khi thêm 500 triệu nano giây (0,5 giây): 2024-07-22T14:30:15.623456789-05:00
Sau khi trừ đi 500 triệu nano giây (0,5 giây): 2024-07-22T14:30:14.623456789-05:00
Sau khi thêm 2 tháng: 2024-09-22T14:30:15.123456789-05:00
Sau khi trừ 2 tháng: 2024-05-22T14:30:15.123456789-05:00
Ví dụ này minh họa cách bạn có thể thay đổi ngày giờ của một đối tượng OffsetDateTime bằng cách cộng hoặc trừ các khoảng thời gian khác nhau.
Chuyển đổi
↳ toLocalDate(): Trả về phần LocalDate (chỉ ngày, không kèm thời gian và độ lệch chuẩn).
↳ atZoneSameInstant(ZoneId zone): Kết hợp OffsetDateTime với múi giờ để tạo ZonedDateTime đảm bảo cùng thời điểm.
↳ atZoneSimilarLocal(ZoneId zone): Kết hợp OffsetDateTime với múi giờ để tạo ZonedDateTime cố gắng giữ nguyên ngày giờ địa phương.
↳ toEpochSecond(): Chuyển đổi OffsetDateTime sang số giây tính từ 01:00:00 ngày 01/01/1970 UTC.
Dưới đây là ví dụ về cách sử dụng các phương thức chuyển đổi của lớp OffsetDateTime trong Java. Chúng ta sẽ sử dụng các phương thức toLocalDate, atZoneSameInstant, atZoneSimilarLocal, và toEpochSecond trong cùng một lớp Java.
Ví dụ: Example.java
import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public class Example {
public static void main(String[] args) {
// Tạo đối tượng OffsetDateTime ban đầu
OffsetDateTime originalDateTime = OffsetDateTime.of(2024, 7, 22, 14, 30, 15, 123456789, (ZoneOffset) ZoneId.of("-05:00"));
// Chuyển đổi thành LocalDate
LocalDate localDate = originalDateTime.toLocalDate();
// Kết hợp với múi giờ để tạo ZonedDateTime (cùng thời điểm)
ZonedDateTime zonedDateTimeSameInstant = originalDateTime.atZoneSameInstant(ZoneId.of("Europe/London"));
// Kết hợp với múi giờ để tạo ZonedDateTime (giữ nguyên ngày giờ địa phương)
ZonedDateTime zonedDateTimeSimilarLocal = originalDateTime.atZoneSimilarLocal(ZoneId.of("Europe/London"));
// Chuyển đổi thành số giây từ 01/01/1970 UTC
long epochSecond = originalDateTime.toEpochSecond();
// In kết quả
System.out.println("OffsetDateTime Gốc: " + originalDateTime);
System.out.println("LocalDate: " + localDate);
System.out.println("ZonedDateTime cùng lúc ở Châu Âu/London: " + zonedDateTimeSameInstant);
System.out.println("ZonedDateTime vào giờ địa phương tương tự ở Châu Âu/London: " + zonedDateTimeSimilarLocal);
System.out.println("Kỷ nguyên thứ hai: " + epochSecond);
}
}
Kết quả của chương trình là:
OffsetDateTime Gốc: 2024-07-22T14:30:15.123456789-05:00
LocalDate: 2024-07-22
ZonedDateTime cùng lúc ở Châu Âu/London: 2024-07-22T20:30:15.123456789+01:00[Europe/London]
ZonedDateTime vào giờ địa phương tương tự ở Châu Âu/London: 2024-07-22T14:30:15.123456789+01:00[Europe/London]
Kỷ nguyên thứ hai: 1721676615
Ví dụ này giúp bạn hiểu cách chuyển đổi giữa các định dạng thời gian khác nhau và cách làm việc với múi giờ trong Java.
Cắt cụt
↳ truncatedTo(TemporalUnit unit): Cắt cụt thời gian theo đơn vị nhất định (ví dụ: cắt cụt đến giờ).
Dưới đây là ví dụ về cách sử dụng phương thức truncatedTo(TemporalUnit unit) của lớp OffsetDateTime trong Java. Phương thức này cắt cụt thời gian đến đơn vị thời gian được chỉ định (ví dụ: giờ, phút, giây).
Ví dụ: Example.java
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
public class Example {
public static void main(String[] args) {
// Tạo đối tượng OffsetDateTime ban đầu
OffsetDateTime originalDateTime = OffsetDateTime.of(2024, 7, 22, 14, 30, 15, 123456789, (ZoneOffset) ZoneId.of("-05:00"));
// Cắt cụt thời gian đến phút
OffsetDateTime truncatedToMinutes = originalDateTime.truncatedTo(ChronoUnit.MINUTES);
// Cắt cụt thời gian đến giờ
OffsetDateTime truncatedToHours = originalDateTime.truncatedTo(ChronoUnit.HOURS);
// Cắt cụt thời gian đến ngày
OffsetDateTime truncatedToDays = originalDateTime.truncatedTo(ChronoUnit.DAYS);
// In kết quả
System.out.println("OffsetDateTime Gốc: " + originalDateTime);
System.out.println("Rút ngắn đến phút: " + truncatedToMinutes);
System.out.println("Rút gọn theo giờ: " + truncatedToHours);
System.out.println("Rút gọn thành ngày: " + truncatedToDays);
}
}
Kết quả của chương trình là:
Rút ngắn đến phút: 2024-07-22T14:30-05:00
Rút gọn theo giờ: 2024-07-22T14:00-05:00
Rút gọn thành ngày: 2024-07-22T00:00-05:00
Các ngoại lệ thường gặp khi sử dụng lớp OffsetDateTime 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: Khi tạo hoặc thao tác với OffsetDateTime, có thể xảy ra lỗi do dữ liệu đầu vào không hợp lệ, chẳng hạn như ngày không tồn tại (ví dụ: ngày 30 tháng 2) hoặc các giá trị thời gian vượt quá giới hạn hợp lệ.
↳ Ví dụ: Cố gắng tạo một OffsetDateTime với ngày 31 tháng 4 hoặc giờ 25 sẽ dẫn đến DateTimeException vì ngày 31 tháng 4 không hợp lệ và giờ 25 là không hợp lệ.
Ngoại lệ DateTimeParseException
↳ Nguyên nhân: Khi phân tích một chuỗi để tạo OffsetDateTime, nếu chuỗi không khớp với định dạng mong đợi, sẽ xảy ra ngoại lệ này.
↳ Ví dụ: Cố gắng phân tích chuỗi "2024-07-22T14:30:45" mà không chỉ định độ lệch chuẩn, trong khi định dạng mong đợi là "2024-07-22T14:30:45+01:00".
Ngoại lệ UnsupportedTemporalTypeException
↳ Nguyên nhân: Khi thực hiện một thao tác hoặc truy vấn mà OffsetDateTime không hỗ trợ, sẽ xảy ra ngoại lệ này.
↳ Ví dụ: Cố gắng cộng số ngày vào một OffsetDateTime khi sử dụng một đơn vị thời gian không được hỗ trợ như "Weeks" sẽ dẫn đến UnsupportedTemporalTypeException.
Ngoại lệ ArithmeticException
↳ Nguyên nhân: Khi thực hiện các phép toán với OffsetDateTime mà kết quả vượt quá giới hạn của kiểu dữ liệu số nguyên, sẽ xảy ra ngoại lệ này.
↳ Ví dụ: Thực hiện phép cộng một số nano giây cực lớn vào một OffsetDateTime có thể dẫn đến số vượt quá giới hạn của Long, gây ra ArithmeticException.
Ngoại lệ NullPointerException
↳ Nguyên nhân: Khi truyền đối tượng null vào các phương thức của OffsetDateTime hoặc khi thao tác với các thuộc tính không hợp lệ.
↳ Ví dụ: Cố gắng tạo OffsetDateTime bằng cách truyền đối tượng ZoneOffset null sẽ gây ra NullPointerException.
Lưu ý:
Khi làm việc với OffsetDateTime, 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.