1. Pengantar TimeZone
TimeZone mewakili offset zona waktu, dan juga dapat menghitung waktu penghematan siang hari.
Zona waktu sering digunakan ketika objek operasi yang mewakili tanggal/waktu seperti tanggal, kalender, dll.; Karena zona waktu yang berbeda memiliki waktu yang berbeda.
Mari kita bicara tentang dua cara umum untuk membuat objek zona waktu.
1. Dapatkan objek zona waktu default
Bagaimana menggunakan:
Timezone tz = timezone.getDefault ()
2. Gunakan metode getTimeZone (string id) untuk mendapatkan objek zona waktu
Bagaimana menggunakan:
// Dapatkan zona waktu yang sesuai dengan "GMT+08: 00" TimeZone China = TimeZone.GetTimEzone ("GMT+: 08: 00"); // Dapatkan zona waktu yang sesuai dengan "China/Chongqing" Chongqing "Chongqing = TimeZone.gettimezone (" Asia/Chongqing "); Untuk nilai semua parameter ID yang didukung oleh GetTimeZone (ID String) Anda dapat menemukannya dengan cara berikut:
String [] ids = timezone.getavailableIds (); untuk (ID string: id) system.out.printf (id+",");
Hasil output:
ETC/GMT+12, ETC/GMT+11, Pacific/Midway, Pacific/Niue ... dll.Misalnya, buat zona waktu yang sesuai dengan nilai cetak kedua "etc/gmt+11" di atas. Metode ini adalah sebagai berikut:
Timezone tz = timezone.gettimezone ("etc/gmt+11"); antarmuka fungsi timezone // konstruktor Timezone ():Object clone()synchronized static String[] getAvailableIDs()synchronized static String[] getAvailableIDs(int offsetMillis)int getDSTSavings()synchronized static TimeZone getDefault()final String getDisplayName(Locale locale)String getDisplayName(boolean daylightTime, int style, Locale locale)final String getDisplayName()final String getDisplayName(boolean daylightTime, int style)String getID()abstract int getOffset(int era, int year, int month, int day, int dayOfWeek, int timeOfDayMillis)int getOffset(long time)abstract int getRawOffset()synchronized static TimeZone getTimeZone(String id)boolean hasSameRules(TimeZone timeZone)abstract boolean inDaylightTime(Date Waktu) Sinkronisasi static void setDefault (timeZone timeZone) void setid (string id) abstrak void setRawoffset (int offsetmillis) abstrak boolean boolean outgeaylighttime ()
2. Contoh TimeZone:
Berikut ini adalah contoh untuk menunjukkan menggunakan zona waktu pada tanggal.
Kode referensi adalah sebagai berikut (TimeZonetest.java):
Impor java.text.dateFormat; import java.util.date; impor java.util.timezone;/*** program pengujian TimeZone*/Kelas Publik TimeZonetest {public static void Main (string [] args) {// test 3 Metode untuk membuat showusAfftimeZones ObjecteSageZones (); // uji API lain dari zona waktu testotherapis (); // Cetak semua ID yang didukung oleh getTimeZone (ID String) // printalltimezones (); } / *** uji 3 Metode untuk membuat objek zona waktu* / public static void showUsageOmezones () {TimeZone TZ; // (01) zona waktu default tz = timezone.getDefault (); printDatein (TZ); // (02) Atur zona waktu ke "GMT+08: 00" TZ = timezone.gettimezone ("GMT+08: 00"); printDatein (TZ); // (03) Atur zona waktu ke "" tz = timezone.gettimezone ("Asia/Chongqing"); printDatein (TZ); }/*** Cetak tanggal/waktu yang sesuai dengan tz*/private static void printDatein (timezone tz) {// tanggal adalah 2013-09-19 14:22:30 Tanggal Tanggal = Tanggal Baru (113, 8, 19, 14, 22, 30); // Dapatkan DateFormat Default untuk Memformat Tanggal Tanggal DF = DateFormat.GetInstance (); // atur zona waktu ke tz df.settimezone (TZ); // Dapatkan string string yang diformat str = df.format (date); System.out.println (tz.getId ()+":"+str); } / ** * uji API TimeZone lainnya * / public static void testotherapis () {// zona waktu default TimeZone TZ = timezone.getDefault (); // dapatkan "id" string id = tz.getId (); // Dapatkan "nama tampilan" string name = tz.getDisplayName (); // Dapatkan "Time Offset". Offset relatif terhadap "meridian utama" adalah MS. int offset = tz.getRawOffset (); // Dapatkan jam yang sesuai dari "waktu offset" int gmt = offset/(3600*1000); System.out.printf ("id =%s, name =%s, offset =%s (ms), gmt =%s/n", id, nama, offset, gmt); } / ** * Cetak semua ID yang didukung oleh getTimeZone (ID String) * / public static void printAllTimeZones () {string [] ids = timezone.getavailableIds (); untuk (ID String: id) {// int offset = timezone.gettimezone (avaids [i]). getRawoffset (); //System.out.println(i+ ""+avaids [i]+""+offset/(3600 * 1000)+"/t"); System.out.printf (id+","); } System.out.println (); }}
3. Tentang TimeZone dan Kalibrasi Waktu
Java dan Solaris sangat mirip dalam hal informasi tentang zona waktu. Setiap zona waktu memiliki pengidentifikasi ID zona waktu. Dalam J2SE 1.3 dan 1.4, ID ini adalah string, yang merupakan daftar ID ini yang terletak di subdirektori JRE/LIB dari installer J2SE. J2SE 1.3 hanya berisi file tzmappings, tetapi J2SE 1.4 berisi file data zona waktu di berbagai wilayah di dunia. JRE/LIB/ZI menyimpan file -file ini. Dalam J2SE 1.4, sun.util.calendar.zoneinfo memperoleh aturan DST dari file -file ini. Di Solaris, file data zona waktu ini disimpan dalam bentuk biner dan bukan file teks, jadi Anda tidak dapat melihatnya. File data zona waktu dalam J2SE 1.4 berbeda dari yang ada di Solaris.
Kode sumber dari metode getDefault di kelas java.util.timezone menunjukkan bahwa pada akhirnya akan memanggil metode getTimeZone dari kelas sun.util.calendar.zoneinfo. Metode ini mengembalikan parameter string sebagai ID untuk area waktu yang diperlukan. ID zona waktu default ini diperoleh dari properti user.timezone (System). Jika User.TimeZone tidak didefinisikan, itu akan mencoba mendapatkan ID dari user.country dan java.home (System) Properties. Jika tidak berhasil menemukan ID zona waktu, ia menggunakan nilai GMT "fallback". Dengan kata lain, jika tidak menghitung ID zona waktu Anda, itu akan menggunakan GMT sebagai zona waktu default Anda.
Perhatikan bahwa properti sistem diinisialisasi dalam metode initproperties dari kelas java.lang.system. Ini adalah metode lokal. Oleh karena itu kode sumber tidak tersedia-kecuali Anda menggali basis kode lokal dalam paket distribusi J2SE untuk dipelajari. Namun, dalam sistem Windows, atribut sistem diinisialisasi dari Registry Windows, sedangkan di Linux/UNIX diinisialisasi oleh variabel lingkungan. Deklarasi Javadoc dari metode initproperties, properti tertentu "harus dijamin akan didefinisikan" dan daftar. Dari tiga properti sistem yang digunakan oleh metode getDefault dari kelas java.util.timezone, hanya java.home yang terdaftar di Javadoc sebagai properti "dijamin".
Solusi yang Direkomendasikan:
Jadi, bagaimana Anda memastikan bahwa Java memberi Anda waktu dan tanggal yang tepat? Cara terbaik adalah mengonfirmasi bahwa kelas timeZone default Java Virtual Machine (JVM) benar dan cocok untuk ruang lingkup geografis Anda (lokal). Bagaimana Anda memastikan bahwa zona waktu default benar dan cocok? Ini adalah masalah baru lainnya. Seperti kebanyakan masalah yang ditangani, ini memiliki banyak solusi. Menurut kode sumber metode java.util.timezone.getDefault, cara terbaik adalah dengan mengatur properti user.timeZone dengan benar. Saat memulai mesin virtual Java, Anda dapat dengan mudah mengganti nilai yang diatur dalam metode java.lang.system.initproperties dengan menggunakan parameter baris perintah -d. Misalnya:
java -duser.timezone = Asia/Shanghai datetest
Perintah ini memulai kelas Datetest dan mengatur properti User.TimeZone ke Asia/Shanghai. Anda juga dapat mengatur properti user.timezone dengan menggunakan metode setProperty dari kelas java.lang.system:
System.setProperty ("user.timezone", "Asia/Shanghai");Jika tidak ada ID zona waktu yang tersedia untuk Anda, maka Anda dapat membuat zona waktu khusus menggunakan metode setDefault dari kelas java.util.timezone untuk mengaturnya ke waktu default zone-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Ingatlah bahwa di J2SE, sebagian besar kelas dan kelas terkait waktu berisi informasi zona waktu, termasuk kelas format tersebut, seperti java.text.dateFormat, sehingga mereka semua dipengaruhi oleh zona waktu default JVM. Namun, ketika Anda membuat contoh kelas -kelas ini, Anda dapat memastikan informasi zona waktu yang benar untuk mereka, membuatnya lebih mudah bagi Anda untuk mengatur zona waktu default dari seluruh JVM. Dan setelah diatur, Anda dapat memastikan bahwa semua kelas ini akan menggunakan zona waktu default yang sama.