1. ZonedDateTimelớp học

Có một lớp rất thú vị khác trong API Ngày Giờ: lớp ZonedDateTime. Mục đích chính của nó là giúp thuận tiện khi làm việc với các ngày ở các múi giờ khác nhau.

LocalDatelà tuyệt vời để đại diện cho ngày. Ví dụ, sinh nhật. Sinh nhật của tôi là ngày 15 tháng 3 bất kể tôi ở đâu. Đây là một ví dụ về một ngày.

LocalTimethật tuyệt khi mô tả thời gian, giống như thời gian được đặt trên đồng hồ báo thức: Tôi đặt báo thức lúc 5 giờ sáng và tôi đang ở đâu không quan trọng. 5 giờ sáng là 5 giờ sáng. Đây là một ví dụ về làm việc với thời gian.

Bây giờ, giả sử rằng chúng ta đang viết một ứng dụng đặt chuyến bay. Máy bay cất cánh và đến theo giờ địa phương. Máy bay ở trên không trong một thời gian cố định, nhưng múi giờ có thể thay đổi.

Múi giờ

Nhân tiện, múi giờ thực sự là một mớ hỗn độn. Và nếu bạn nghĩ rằng có 24 múi giờ thì bạn đã nhầm to.

Ví dụ: thời gian ở Ấn Độ khác với Giờ chuẩn Greenwich năm tiếng rưỡi: GMT+5:30. Một số quốc gia chuyển sang thời gian tiết kiệm ánh sáng ban ngày và những quốc gia khác thì không. Hơn nữa, các quốc gia khác nhau chuyển sang thời gian mùa hè vào những thời điểm khác nhau trong năm.

Và một số quốc gia thông qua luật hủy bỏ thời gian tiết kiệm ánh sáng ban ngày hoặc giới thiệu lại hoặc hủy bỏ nó một lần nữa.

Trong mọi trường hợp, thế giới có các múi giờ và trong mỗi múi giờ có một thời gian. Thời gian ở các khu vực khác nhau có thể trùng nhau trong các khoảng thời gian nhất định trong năm và sau đó khác nhau trong các khoảng thời gian khác. Các múi giờ thường được đặt tên theo các thành phố lớn nằm trong đó: Europe/Monaco, Asia/Singapore, nhưng cũng có những trường hợp ngoại lệ — US/Pacific.

Chính thức, có 599 múi giờ vào lúc này. Hãy suy nghĩ về nó: 599. Đó là xa 24. Chào mừng đến với thế giới toàn cầu.

Lớp ZoneIdtừ java.timegói được sử dụng để lưu trữ múi giờ trong Java.

Nhân tiện, nó có một getAvailableZoneIds()phương thức tĩnh, trả về tập hợp tất cả các múi giờ hiện đã biết. Để có danh sách tất cả các vùng, bạn cần viết đoạn mã sau:

Mã số Đầu ra bảng điều khiển (một phần)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

Để lấy một ZoneIdđối tượng theo tên của nó, bạn cần sử dụng of()phương thức tĩnh;

Mã số Ghi chú
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. Tạo ZonedDateTimeđối tượng

Khi tạo một ZonedDateTimeđối tượng, bạn cần gọi now()phương thức tĩnh của lớp và truyền một ZoneIdđối tượng cho nó.

Mã số Đầu ra bảng điều khiển
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime time = ZonedDateTime.now(zone);
System.out.println(time);


2019-02-22T11:37:58.074816+02:00[Africa/Cairo]

Nếu bạn không truyền ZoneIdđối tượng vào now()phương thức (và điều đó được cho phép), thì múi giờ sẽ được xác định tự động dựa trên cài đặt của máy tính đang chạy chương trình.

Ví dụ:

Mã số Đầu ra bảng điều khiển
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

2019-02-22T13:39:05.70842+02:00[Europe/Helsinki]

Chuyển đổi ngày toàn cầu thành ngày địa phương

Một trong những tính năng thú vị của ZonedDateTimenó là khả năng chuyển đổi sang ngày giờ địa phương. Ví dụ:

ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);

LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();

3. Làm việc với thời gian

Giống như LocalDateTimelớp, ZonedDateTimelớp có nhiều cách để lấy các phần tử riêng lẻ của ngày và giờ. Dưới đây là danh sách các phương pháp này:

int getYear()
Trả về năm của một ngày cụ thể
Month getMonth()
Trả về tháng của ngày: một trong nhiều hằng số —JANUARY, FEBRUARY, ...;
int getMonthValue()
Trả về chỉ số tháng của ngày. tháng 1 == 1
int getDayOfMonth()
Trả về chỉ số của ngày trong tháng
DayOfWeek getDayOfWeek()
Trả về ngày trong tuần: một trong nhiều hằng số —MONDAY, TUESDAY, ...;
int getDayOfYear()
Trả về chỉ số của ngày trong năm
int getHour()
Trả về giờ
int getMinute()
Trả về số phút
int getSecond()
Trả về giây
int getNano()
Trả về nano giây

Tất cả các phương thức hoàn toàn tương tự với các phương thức của lớp LocalDateTime. Và, tất nhiên, ZonedDateTimelớp có các phương thức cho phép bạn làm việc với ngày và giờ. Điều đó nói rằng, đối tượng mà các phương thức được gọi không thay đổi. Thay vào đó, chúng trả về một ZonedDateTimeđối tượng mới:

phương pháp Sự miêu tả
plusYears(int)
Thêm năm vào ngày
plusMonths(int)
Thêm tháng vào ngày
plusDays(int)
Thêm ngày vào ngày
plusHours(int)
Thêm giờ
plusMinutes(int)
Thêm phút
plusSeconds(int)
Thêm giây
plusNanos(int)
Thêm nano giây
minusYears(int)
Trừ năm kể từ ngày
minusMonths(int)
Trừ tháng kể từ ngày
minusDays(int)
Trừ ngày kể từ ngày
minusHours(int)
trừ giờ
minusMinutes(int)
trừ phút
minusSeconds(int)
Trừ giây
minusNanos(int)
Trừ đi nano giây

Chúng tôi sẽ không cung cấp bất kỳ ví dụ nào, vì chúng tôi nghĩ rằng mọi thứ ở đây đều rõ ràng bằng cách tương tự với các lớp mà chúng tôi vừa xem xét.