Javascript lấy tên múi giờ

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