Múi giờ là một vùng trên trái đất sử dụng cùng một giờ tiêu chuẩn. Mỗi múi giờ được mô tả bằng một mã định danh và thường có định dạng vùng/thành phố [Châu Á/Tokyo] và phần bù từ giờ Greenwich/UTC. Ví dụ: phần bù cho Tokyo là +09. 00
ZoneId và ZoneOffset
API Ngày-Giờ cung cấp hai lớp để chỉ định múi giờ hoặc độ lệch
- ZoneId chỉ định mã định danh múi giờ và cung cấp các quy tắc để chuyển đổi giữa Instant và LocalDateTime
- ZoneOffset chỉ định chênh lệch múi giờ từ thời gian Greenwich/UTC
Độ lệch so với thời gian Greenwich/UTC thường được xác định bằng cả giờ, nhưng vẫn có những trường hợp ngoại lệ. Đoạn mã sau, từ ví dụ TimeZoneId
, in danh sách tất cả các múi giờ sử dụng hiệu số từ Greenwich/UTC không được xác định theo giờ
Set allZones = ZoneId.getAvailableZoneIds[]; LocalDateTime dt = LocalDateTime.now[]; // Create a List using the set of zones and sort it. List zoneList = new ArrayList[allZones]; Collections.sort[zoneList]; ... for [String s : zoneList] { ZoneId zone = ZoneId.of[s]; ZonedDateTime zdt = dt.atZone[zone]; ZoneOffset offset = zdt.getOffset[]; int secondsOfHour = offset.getTotalSeconds[] % [60 * 60]; String out = String.format["%35s %10s%n", zone, offset]; // Write only time zones that do not have a whole hour offset // to standard out. if [secondsOfHour != 0] { System.out.printf[out]; } ... }
Ví dụ này in danh sách sau đây thành tiêu chuẩn
America/Caracas -04:30 America/St_Johns -02:30 Asia/Calcutta +05:30 Asia/Colombo +05:30 Asia/Kabul +04:30 Asia/Kathmandu +05:45 Asia/Katmandu +05:45 Asia/Kolkata +05:30 Asia/Rangoon +06:30 Asia/Tehran +04:30 Australia/Adelaide +09:30 Australia/Broken_Hill +09:30 Australia/Darwin +09:30 Australia/Eucla +08:45 Australia/LHI +10:30 Australia/Lord_Howe +10:30 Australia/North +09:30 Australia/South +09:30 Australia/Yancowinna +09:30 Canada/Newfoundland -02:30 Indian/Cocos +06:30 Iran +04:30 NZ-CHAT +12:45 Pacific/Chatham +12:45 Pacific/Marquesas -09:30 Pacific/Norfolk +11:30
Ví dụ TimeZoneId cũng in danh sách tất cả các ID múi giờ vào một tệp có tên là timeZones
Các lớp ngày-thời gian
API Ngày-Giờ cung cấp ba lớp dựa trên thời gian hoạt động với các múi giờ
- ZonedDateTime xử lý ngày và giờ với múi giờ tương ứng với phần bù múi giờ từ Greenwich/UTC
- OffsetDateTime xử lý ngày và giờ với độ lệch múi giờ tương ứng từ Greenwich/UTC, không có ID múi giờ
- OffsetTime xử lý thời gian với độ lệch múi giờ tương ứng từ Greenwich/UTC, không có ID múi giờ
Khi nào bạn sẽ sử dụng OffsetDateTime thay vì ZonedDateTime? . Ngoài ra, XML và các định dạng mạng khác xác định chuyển ngày-thời gian là OffsetDateTime hoặc OffsetTime
Mặc dù cả ba lớp đều duy trì độ lệch so với thời gian Greenwich/UTC, nhưng chỉ có ZonedDateTime sử dụng ZoneRules, một phần của java. thời gian. gói múi giờ, để xác định mức độ chênh lệch thay đổi như thế nào đối với một múi giờ cụ thể. Ví dụ: hầu hết các múi giờ đều có khoảng cách [thường là 1 giờ] khi di chuyển đồng hồ về phía trước theo thời gian tiết kiệm ánh sáng ban ngày và thời gian trùng lặp khi di chuyển đồng hồ về thời gian tiêu chuẩn và giờ cuối cùng trước khi quá trình chuyển đổi được lặp lại. Lớp ZonedDateTime đáp ứng tình huống này, trong khi các lớp OffsetDateTime và OffsetTime, không có quyền truy cập vào ZoneRules, không
Đã khoanh vùngNgày giờ
Trên thực tế, lớp ZonedDateTime kết hợp lớp LocalDateTime với lớp ZoneId. Nó được sử dụng để biểu thị đầy đủ ngày [năm, tháng, ngày] và thời gian [giờ, phút, giây, nano giây] với múi giờ [khu vực/thành phố, chẳng hạn như Châu Âu/Paris]
Đoạn mã sau, từ ví dụ Flight
, xác định thời gian khởi hành cho chuyến bay từ San Francisco đến Tokyo dưới dạng ZonedDateTime ở múi giờ Mỹ/Los Angeles. Các phương thức withZoneSameInstant và plusMinutes được sử dụng để tạo một thể hiện của ZonedDateTime biểu thị thời gian dự kiến đến Tokyo, sau chuyến bay 650 phút. Quy tắc khu vực. Phương thức isDaylightSavings xác định xem đó có phải là thời gian tiết kiệm ánh sáng ban ngày hay không khi chuyến bay đến Tokyo
Một đối tượng DateTimeFormatter được sử dụng để định dạng các phiên bản ZonedDateTime để in
DateTimeFormatter format = DateTimeFormatter.ofPattern["MMM d yyyy hh:mm a"]; // Leaving from San Francisco on July 20, 2013, at 7:30 p.m. LocalDateTime leaving = LocalDateTime.of[2013, Month.JULY, 20, 19, 30]; ZoneId leavingZone = ZoneId.of["America/Los_Angeles"]; ZonedDateTime departure = ZonedDateTime.of[leaving, leavingZone]; try { String out1 = departure.format[format]; System.out.printf["LEAVING: %s [%s]%n", out1, leavingZone]; } catch [DateTimeException exc] { System.out.printf["%s can't be formatted!%n", departure]; throw exc; } // Flight is 10 hours and 50 minutes, or 650 minutes ZoneId arrivingZone = ZoneId.of["Asia/Tokyo"]; ZonedDateTime arrival = departure.withZoneSameInstant[arrivingZone] .plusMinutes[650]; try { String out2 = arrival.format[format]; System.out.printf["ARRIVING: %s [%s]%n", out2, arrivingZone]; } catch [DateTimeException exc] { System.out.printf["%s can't be formatted!%n", arrival]; throw exc; } if [arrivingZone.getRules[].isDaylightSavings[arrival.toInstant[]]] System.out.printf[" [%s daylight saving time will be in effect.]%n", arrivingZone]; else System.out.printf[" [%s standard time will be in effect.]%n", arrivingZone];
Điều này tạo ra đầu ra sau
LEAVING: Jul 20 2013 07:30 PM [America/Los_Angeles] ARRIVING: Jul 21 2013 10:20 PM [Asia/Tokyo] [Asia/Tokyo standard time will be in effect.]
Bù đắpDateTime
Trên thực tế, lớp OffsetDateTime kết hợp lớp LocalDateTime với lớp ZoneOffset. Nó được sử dụng để biểu thị đầy đủ ngày [năm, tháng, ngày] và thời gian [giờ, phút, giây, nano giây] với độ lệch từ thời gian Greenwich/UTC [+/- giờ. phút, chẳng hạn như +06. 00 hoặc -08. 00]
Ví dụ sau sử dụng OffsetDateTime với TemporalAdjuster. phương pháp lastDay để tìm thứ năm cuối cùng trong tháng 7 năm 2013
// Find the last Thursday in July 2013. LocalDateTime localDate = LocalDateTime.of[2013, Month.JULY, 20, 19, 30]; ZoneOffset offset = ZoneOffset.of["-08:00"]; OffsetDateTime offsetDate = OffsetDateTime.of[localDate, offset]; OffsetDateTime lastThursday = offsetDate.with[TemporalAdjusters.lastInMonth[DayOfWeek.THURSDAY]]; System.out.printf["The last Thursday in July 2013 is the %sth.%n", lastThursday.getDayOfMonth[]];
Đầu ra từ việc chạy mã này là
The last Thursday in July 2013 is the 25th.
Thời gian bù đắp
Trên thực tế, lớp OffsetTime kết hợp lớp LocalTime với lớp ZoneOffset. Nó được sử dụng để biểu thị thời gian [giờ, phút, giây, nano giây] với độ lệch so với thời gian Greenwich/UTC [+/-giờ. phút, chẳng hạn như +06. 00 hoặc -08. 00]
Lớp OffsetTime được sử dụng trong các trường hợp giống như lớp OffsetDateTime, nhưng khi theo dõi ngày thì không cần thiết