Paparkan Semua Zon Waktu Dengan GMT Dan UTC di Java

1. Gambaran keseluruhan

Setiap kali kita berurusan dengan waktu dan tarikh, kita memerlukan kerangka rujukan. Standard untuk itu adalah UTC, tetapi kami juga melihat GMT dalam beberapa aplikasi.

Ringkasnya, UTC adalah standard, sementara GMT adalah zon waktu.

Inilah yang diberitahu oleh Wikipedia mengenai apa yang harus digunakan:

Untuk kebanyakan tujuan, UTC dianggap boleh ditukar dengan Greenwich Mean Time (GMT), tetapi GMT tidak lagi ditentukan dengan tepat oleh komuniti saintifik.

Dengan kata lain, setelah kita menyusun senarai dengan offset zon waktu di UTC, kita juga akan mendapatkannya untuk GMT.

Pertama, kita akan melihat cara Java 8 untuk mencapainya dan kemudian kita akan melihat bagaimana kita dapat memperoleh hasil yang sama di Java 7.

2. Mendapatkan Senarai Zon

Sebagai permulaan, kita perlu mendapatkan senarai semua zon waktu yang ditentukan.

Untuk tujuan ini, kelas ZoneId mempunyai kaedah statik yang berguna:

Set availableZoneIds = ZoneId.getAvailableZoneIds();

Kemudian, kita boleh menggunakan Set untuk menghasilkan senarai zon waktu yang disusun dengan offset yang sesuai:

public List getTimeZoneList(OffsetBase base) { LocalDateTime now = LocalDateTime.now(); return ZoneId.getAvailableZoneIds().stream() .map(ZoneId::of) .sorted(new ZoneComparator()) .map(id -> String.format( "(%s%s) %s", base, getOffset(now, id), id.getId())) .collect(Collectors.toList()); }

Kaedah di atas menggunakan parameter enum yang mewakili ofset yang ingin kita lihat:

public enum OffsetBase { GMT, UTC }

Sekarang mari kita perhatikan kodnya dengan lebih terperinci.

Setelah kami mendapatkan semua ID zon yang ada, kami memerlukan rujukan waktu sebenar, yang diwakili oleh LocalDateTime.now ().

Setelah itu, kami menggunakan Java's Stream API untuk melakukan iterasi pada setiap entri dalam rangkaian String id zon waktu kami dan mengubahnya menjadi senarai zon waktu yang diformat dengan ofset yang sesuai.

Untuk setiap entri ini, kami menghasilkan instance ZoneId dengan peta (ZoneId :: of).

3. Mendapatkan Offset

Kita juga perlu mencari offset UTC yang sebenarnya. Sebagai contoh, dalam kes Waktu Eropah Tengah, pengimbangannya adalah +01: 00.

Untuk mendapatkan offset UTC untuk zon tertentu, kita boleh menggunakan kaedah getOffset () LocalDateTime .

Juga ambil perhatian bahawa Java mewakili 00: 00 ofset sebagai Z .

Oleh itu, untuk mempunyai String mencari zon waktu yang konsisten dengan ofset sifar, kami akan menggantikan Z dengan +00: 00:

private String getOffset(LocalDateTime dateTime, ZoneId id) { return dateTime .atZone(id) .getOffset() .getId() .replace("Z", "+00:00"); }

4. Membuat Zon Sebanding

Sebagai pilihan, kami juga dapat menyusun zon waktu mengikut ofset.

Untuk ini, kami akan menggunakan kelas ZoneComparator :

private class ZoneComparator implements Comparator { @Override public int compare(ZoneId zoneId1, ZoneId zoneId2) { LocalDateTime now = LocalDateTime.now(); ZoneOffset offset1 = now.atZone(zoneId1).getOffset(); ZoneOffset offset2 = now.atZone(zoneId2).getOffset(); return offset1.compareTo(offset2); } }

5. Memaparkan Zon Waktu

Yang tinggal hanyalah mengumpulkan bahagian-bahagian di atas dengan memanggil kaedah getTimeZoneList () untuk setiap nilai enum OffsetBase dan memaparkan senarai:

public class TimezoneDisplayApp { public static void main(String... args) { TimezoneDisplay display = new TimezoneDisplay(); System.out.println("Time zones in UTC:"); List utc = display.getTimeZoneList( TimezoneDisplay.OffsetBase.UTC); utc.forEach(System.out::println); System.out.println("Time zones in GMT:"); List gmt = display.getTimeZoneList( TimezoneDisplay.OffsetBase.GMT); gmt.forEach(System.out::println); } }

Apabila kita menjalankan kod di atas, ia akan mencetak zon waktu untuk UTC dan GMT.

Berikut adalah coretan bagaimana output akan kelihatan seperti:

Time zones in UTC: (UTC+14:00) Pacific/Apia (UTC+14:00) Pacific/Kiritimati (UTC+14:00) Pacific/Tongatapu (UTC+14:00) Etc/GMT-14

6. Java 7 dan Sebelum

Java 8 menjadikan tugas ini lebih mudah dengan menggunakan API Stream dan Tarikh dan Masa .

Namun, jika kita mempunyai Java 7 dan sebelum projek, kita masih boleh mencapai hasil yang sama dengan bergantung pada kelas java.util.TimeZone dengan kaedah getAvailableIDs () :

public List getTimeZoneList(OffsetBase base) { String[] availableZoneIds = TimeZone.getAvailableIDs(); List result = new ArrayList(availableZoneIds.length); for (String zoneId : availableZoneIds) { TimeZone curTimeZone = TimeZone.getTimeZone(zoneId); String offset = calculateOffset(curTimeZone.getRawOffset()); result.add(String.format("(%s%s) %s", base, offset, zoneId)); } Collections.sort(result); return result; }

Perbezaan utama dengan kod Java 8 adalah pengiraan ofset.

The rawOffset kita dapat daripada TimeZone () 's getRawOffset () kaedah meluahkan zon masa yang mengimbangi dalam milisaat .

Oleh itu, kita perlu mengubahnya menjadi jam dan minit menggunakan kelas TimeUnit :

private String calculateOffset(int rawOffset) { if (rawOffset == 0) { return "+00:00"; } long hours = TimeUnit.MILLISECONDS.toHours(rawOffset); long minutes = TimeUnit.MILLISECONDS.toMinutes(rawOffset); minutes = Math.abs(minutes - TimeUnit.HOURS.toMinutes(hours)); return String.format("%+03d:%02d", hours, Math.abs(minutes)); }

7. Kesimpulannya

Dalam tutorial ringkas ini, kita telah melihat bagaimana kita dapat menyusun senarai semua zon waktu yang tersedia dengan offset UTC dan GMT mereka.

Dan, seperti biasa, kod sumber penuh untuk contoh boleh didapati di GitHub.