1. บทนำสู่เขตเวลา
เขตเวลาแสดงถึงการชดเชยเขตเวลาและยังสามารถคำนวณเวลาประหยัดเวลากลางวัน
เขตเวลามักจะใช้เมื่อวัตถุปฏิบัติการแสดงวันที่/เวลาเช่นวันที่ปฏิทิน ฯลฯ ; เพราะโซนเวลาที่แตกต่างกันมีเวลาแตกต่างกัน
มาพูดถึงสองวิธีทั่วไปในการสร้างวัตถุเขตเวลา
1. รับวัตถุเขตเวลาเริ่มต้น
วิธีใช้:
Timezone TZ = Timezone.getDefault ()
2. ใช้เมธอด getTimeZone (String ID) เพื่อรับวัตถุ TimeZone
วิธีใช้:
// รับโซนเวลาที่สอดคล้องกับ "GMT+08: 00" Timezone China = Timezone.getTimeZone ("GMT+: 08: 00"); // รับโซนเวลาที่สอดคล้องกับ "China/Chongqing" Timezone Chongqing = Timezone.getTimezone สำหรับค่าของพารามิเตอร์ ID ทั้งหมดที่รองรับโดย GetTimeZone (String ID) คุณสามารถค้นหาได้ด้วยวิธีต่อไปนี้:
String [] ids = timezone.getAvailableIds (); สำหรับ (id id: ids) system.out.printf (id+",");
ผลลัพธ์ผลลัพธ์:
ฯลฯ/gmt+12, etc/gmt+11, แปซิฟิก/มิดเวย์, แปซิฟิก/niue ...ตัวอย่างเช่นสร้างเขตเวลาที่สอดคล้องกับค่าการพิมพ์ที่สอง "etc/gmt+11" ด้านบน วิธีนี้มีดังนี้:
Timezone Tz = Timezone.getTimeZone ("etc/gmt+11"); อินเตอร์เฟสฟังก์ชั่นของ Timezone // constructor เขตเวลา ():Object clone () สตริงคงที่ซิงโครไนซ์ [] getAvailableIds () สตริงคงที่ซิงโครไนซ์ [] getAvailableIds (int offsetMillis) int getDstSavings () ซิงโครไนซ์ไทม์ไทม์สแตติกไทม์เฟต () สตริงสายไฟสุดท้าย getDisplayName () สตริงสุดท้าย getDisplayName (Boolean Daylighttime, Int Style) String () บทคัดย่อ int int getOffset (Int ERA, Int Year, Int Month, Int Day, Int Dayofweek, Int Timeofdaymillis) เขตเวลา) นามธรรมบูลีน indaylighttime (เวลาวันที่) void static setdefault แบบซิงโครไนซ์แบบซิงโครไนซ์ (เขตเวลาเขตเวลา) เป็นโมฆะ setId (String id) บทคัดย่อ void setrawoffset (int offsetmillis) บทคัดย่อบูลีน
2. ตัวอย่างเขตเวลา:
ต่อไปนี้เป็นตัวอย่างที่แสดงให้เห็นถึงการใช้เขตเวลาในวันที่
รหัสอ้างอิงมีดังนี้ (Timezonetest.java):
นำเข้า java.text.dateFormat; นำเข้า Java.util.date; นำเข้า java.util.timezone;/*** โปรแกรมการทดสอบของ Zone Zone*/ชั้นเรียนสาธารณะ Timezonetest {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {// ทดสอบ 3 วิธีสำหรับการสร้างวัตถุ // ทดสอบ APIs อื่น ๆ ของ Timezone Testotherapis (); // พิมพ์ ID ทั้งหมดที่รองรับโดย getTimeZone (String ID) // printalltimezones (); } / *** ทดสอบ 3 วิธีสำหรับการสร้างวัตถุเขตเวลา* / โมฆะคงที่สาธารณะ showusageoftimezones () {timezone tz; // (01) โซนเวลาเริ่มต้น tz = timezone.getDefault (); printdatein (TZ); // (02) ตั้งค่าโซนเวลาเป็น "GMT+08: 00" TZ = Timezone.getTimeZone ("GMT+08: 00"); printdatein (TZ); // (03) ตั้งค่าโซนเวลาเป็น "" tz = timezone.gettimezone ("Asia/Chongqing"); printdatein (TZ); }/*** พิมพ์วันที่/เวลาที่สอดคล้องกับ tz*/โมฆะคงที่ private printdatein (timezone tz) {// วันที่คือ 2013-09-19 14:22:30 วันที่วันที่ = วันที่ใหม่ (113, 8, 19, 14, 22, 30); // รับ dateformat เริ่มต้นสำหรับการจัดรูปแบบวันที่วันที่ dateformat df = dateformat.getInstance (); // ตั้งค่าโซนเวลาเป็น tz df.settimezone (TZ); // รับสตริงสตริงที่จัดรูปแบบ str = df.format (วันที่); System.out.println (tz.getId ()+":"+str); } / ** * ทดสอบ APIs อื่น ๆ ของเขตเวลา * / โมฆะสาธารณะคงที่ testotherapis () {// โซนเวลาเวลาเริ่มต้นเขตเวลา tz = timezone.getDefault (); // รับสตริง "id" id = tz.getId (); // รับ "ชื่อจอแสดงผล" ชื่อสตริง = tz.getDisplayName (); // รับ "ชดเชยเวลา" ออฟเซ็ตที่สัมพันธ์กับ "เมริเดียนหลัก" คือ MS int offset = tz.getrawoffset (); // รับชั่วโมงที่สอดคล้องกันของ "เวลาชดเชย" int gmt = ออฟเซ็ต/(3600*1000); System.out.printf ("id =%s, ชื่อ =%s, ออฟเซ็ต =%s (ms), gmt =%s/n", id, ชื่อ, ออฟเซ็ต, gmt); } / ** * พิมพ์ ID ทั้งหมดที่รองรับโดย getTimeZone (String id) * / โมฆะคงที่ printalltimezones () {string [] ids = timezone.getAvailableIds (); สำหรับ (id id: ids) {// int offset = timezone.gettimezone (avaids [i]). getRawoffset (); //system.out.println(i+ ""+Avaids [i]+""+ออฟเซ็ต/(3600 * 1000)+"/t"); System.out.printf (id+","); } system.out.println (); -
3. เกี่ยวกับเขตเวลาและการสอบเทียบเวลา
Java และ Solaris คล้ายกันมากเมื่อพูดถึงข้อมูลเกี่ยวกับโซนเวลา แต่ละโซนเวลามีตัวระบุ ID โซนเวลา ใน J2SE 1.3 และ 1.4 ID นี้เป็นสตริงซึ่งเป็นรายการของ ID เหล่านี้ที่อยู่ในไดเรกทอรีย่อย JRE/LIB ของตัวติดตั้ง J2SE J2SE 1.3 มีไฟล์ TZMAppings เท่านั้น แต่ J2SE 1.4 มีไฟล์ข้อมูลโซนเวลาในภูมิภาคต่าง ๆ ของโลก JRE/LIB/ZI เก็บไฟล์เหล่านี้ ใน J2SE 1.4, sun.util.calendar.zoneinfo ได้รับกฎ DST จากไฟล์เหล่านี้ ใน Solaris ไฟล์ข้อมูลโซนเวลาเหล่านี้จะถูกเก็บไว้ในรูปแบบไบนารีและไม่ใช่ไฟล์ข้อความดังนั้นคุณจึงไม่สามารถดูได้ ไฟล์ข้อมูลโซนเวลาใน J2SE 1.4 นั้นแตกต่างจากใน Solaris
ซอร์สโค้ดของวิธี getDefault ในคลาส java.util.timezone แสดงให้เห็นว่าในที่สุดมันจะเรียกวิธี getTimeZone ของคลาส sun.util.calendar.zoneinfo วิธีนี้ส่งคืนพารามิเตอร์สตริงเป็น ID สำหรับพื้นที่เวลาที่ต้องการ ID โซนเวลาเริ่มต้นนี้ได้รับจากคุณสมบัติ user.timezone (ระบบ) หากไม่ได้กำหนด user.timezone จะพยายามรับ ID จากคุณสมบัติของผู้ใช้และ Java.home (ระบบ) หากไม่พบ ID โซนเวลาสำเร็จจะใช้ค่า "ทางเลือก" GMT " กล่าวอีกนัยหนึ่งหากไม่ได้คำนวณ ID โซนเวลาของคุณจะใช้ GMT เป็นเขตเวลาเริ่มต้นของคุณ
โปรดทราบว่าคุณสมบัติของระบบจะเริ่มต้นในวิธีการเริ่มต้นของคลาส java.lang.system นี่เป็นวิธีการในท้องถิ่น ดังนั้นซอร์สโค้ดจึงไม่สามารถใช้ได้-เว้นแต่คุณจะขุดลงในฐานรหัสท้องถิ่นในแพ็คเกจการกระจาย J2SE เพื่อศึกษา อย่างไรก็ตามในระบบ Windows แอตทริบิวต์ระบบจะเริ่มต้นจากรีจิสทรี Windows ในขณะที่ใน Linux/UNIX จะเริ่มต้นด้วยตัวแปรสภาพแวดล้อม การประกาศ Javadoc ของวิธีการเริ่มต้นคุณสมบัติบางอย่าง "จะต้องรับประกันว่าจะถูกกำหนด" และแสดงรายการ จากคุณสมบัติของระบบทั้งสามที่ใช้โดยวิธี getDefault ของคลาส java.util.timezone เพียง Java.home เท่านั้นที่ระบุไว้ใน Javadoc เป็นคุณสมบัติ "รับประกัน"
โซลูชั่นที่แนะนำ:
ดังนั้นคุณจะแน่ใจได้อย่างไรว่า Java ให้เวลาและวันที่เหมาะสมกับคุณได้อย่างไร? วิธีที่ดีที่สุดคือการยืนยันว่าคลาสเขตเวลาเริ่มต้นของ Java Virtual Machine (JVM) นั้นถูกต้องและเหมาะสำหรับขอบเขตทางภูมิศาสตร์ของคุณ (locale) คุณจะแน่ใจได้อย่างไรว่าเขตเวลาเริ่มต้นนั้นถูกต้องและเหมาะสม? นี่เป็นอีกปัญหาใหม่ เช่นเดียวกับปัญหาส่วนใหญ่ที่เกี่ยวข้องกับสิ่งนี้มีวิธีแก้ปัญหามากมาย ตามซอร์สโค้ดของวิธี java.util.timezone.getDefault วิธีที่ดีที่สุดคือการตั้งค่าคุณสมบัติ user.timezone อย่างถูกต้อง เมื่อเริ่มต้นเครื่องเสมือน Java คุณสามารถแทนที่ค่าที่ตั้งค่าไว้ในเมธอด java.lang.system.initProperties ได้อย่างง่ายดายโดยใช้พารามิเตอร์บรรทัดคำสั่ง -D ตัวอย่างเช่น:
java -duser.timezone = Asia/Shanghai DateTest
คำสั่งนี้เริ่มต้นคลาส datetest และตั้งค่าคุณสมบัติ user.timezone เป็นเอเชีย/เซี่ยงไฮ้ นอกจากนี้คุณยังสามารถตั้งค่าคุณสมบัติ user.timezone โดยใช้วิธี setProperty ของคลาส java.lang.system:
System.SetProperty ("user.timezone", "เอเชีย/เซี่ยงไฮ้");หากไม่มี ID โซนเวลาที่พร้อมใช้งานสำหรับคุณคุณสามารถสร้างเขตเวลาที่กำหนดเองโดยใช้วิธี setDefault ของคลาส java.util.timezone เพื่อตั้งค่าเป็นเวลาเริ่มต้น โซน ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
โปรดจำไว้ว่าใน J2SE คลาสวันที่และเวลาส่วนใหญ่มีข้อมูลโซนเวลารวมถึงคลาสรูปแบบเหล่านั้นเช่น java.text.dateFormat ดังนั้นพวกเขาทั้งหมดได้รับผลกระทบจากเขตเวลาเริ่มต้นของ JVM อย่างไรก็ตามเมื่อคุณสร้างอินสแตนซ์ของคลาสเหล่านี้คุณสามารถมั่นใจได้ว่าข้อมูลโซนเวลาที่ถูกต้องสำหรับพวกเขาทำให้ง่ายขึ้นสำหรับคุณในการตั้งค่าโซนเวลาเริ่มต้นของ JVM ทั้งหมด และเมื่อตั้งค่าแล้วคุณสามารถมั่นใจได้ว่าคลาสเหล่านี้ทั้งหมดจะใช้โซนเวลาเริ่มต้นเดียวกัน