1. مقدمة إلى المنطقة الزمنية
تمثل المنطقة الزمنية إزاحة المنطقة الزمنية ، ويمكنها أيضًا حساب وقت توفير ضوء النهار.
غالبًا ما يتم استخدام المنطقة الزمنية عند تشغيل الكائنات التي تمثل تواريخ/أوقات مثل التاريخ والتقويم وما إلى ذلك ؛ لأن المناطق الزمنية المختلفة لها أوقات مختلفة.
دعنا نتحدث عن طريقتين شائعتين لإنشاء كائنات للمنطقة الزمنية.
1. احصل على كائن المنطقة الزمنية الافتراضية
كيفية استخدام:
Timezone tz = timezone.getDefault ()
2. استخدم طريقة GetTimeZone (معرف السلسلة) للحصول على كائن من المنطقة الزمنية
كيفية استخدام:
// احصل على المنطقة الزمنية المقابلة لـ "GMT+08: 00" TimeZone China = timezone.gettimezone ("GMT+: 08: 00") ؛ // احصل على المنطقة الزمنية المقابلة لـ "China/Chongqing" TimeZone Chongquing = timezone.gettimezone ("Asia/Chongqing") ؛ بالنسبة لقيم جميع معلمات المعرف التي تدعمها GetTimeZone (معرف السلسلة) ، يمكنك العثور عليها بالطرق التالية:
String [] ids = timezone.getavailableIDS () ؛ لـ (معرف السلسلة: ids) system.out.printf (id+"،") ؛
نتيجة الإخراج:
ETC/GMT+12 ، ETC/GMT+11 ، Pacific/Midway ، Pacific/Niue ... إلخ.على سبيل المثال ، قم بإنشاء المنطقة الزمنية المقابلة لقيمة الطباعة الثانية "ETC/GMT+11" أعلاه. الطريقة كما يلي:
Timezone tz = timezone.gettimezone ("etc/gmt+11") ؛ واجهة وظيفة المنطقة الزمنية // مُنشئ الزمن ():كائن clone () سلسلة ثابتة متزامنة [] getavailableids () سلسلة ثابتة متزامنة [] getAvailableIds (int offsetmillis) int getDStsavings () متزامنة static static timezone getDefaul سلسلة getDisplayName (Boolean Daylighttime ، int style) سلسلة getId () الملخص int getOffset (int era ، int year ، int ، int day ، int dayofweek ، intofdaymillis) int getoffset (time time) inting inting getrawoffset () synchronized static timezone getTimezone (str str strep boolean hassameres ( الوقت) متزامنة الفراغ الثابتة setDefault (الزمن الزمني الزمني) void setID (معرف السلسلة) التجريدية void setRawoffset (int offsetmillis) ملخص منطقي eduaylighttime ()
2. مثال على المنطقة الزمنية:
فيما يلي مثال لإظهار استخدام المنطقة الزمنية في التاريخ.
رمز المرجع كما يلي (TimeZonetest.java):
استيراد java.text.dateformat ؛ استيراد java.util.date ؛ استيراد java.util.timezone ؛/*** TimeZone test برنامج*/class public timezonetest {public static void main (string [] args) {// test 3 طرق لإنشاء timzone object showusaftimezones () ؛ // اختبار واجهات برمجة التطبيقات الأخرى من timezone testOTherApis () ؛ // طباعة جميع المعرفات المدعومة من GetTimeZone (معرف السلسلة) // printalltimezones () ؛ } / *** Test 3 طرق لإنشاء كائنات زمنية* / public static void showUsageOftIteSones () {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 static void printdatein (Timezone tz) {// Date هو 2013-09-19 14:22:30 تاريخ التاريخ = تاريخ جديد (113 ، 8 ، 19 ، 14 ، 22 ، 30) ؛ // احصل على DateFormat الافتراضي لتنسيق DateFormat df = dateFormat.getInstance () ؛ // قم بتعيين المنطقة الزمنية على tz df.settimezone (TZ) ؛ // احصل على سلسلة السلسلة المنسقة str = df.format (date) ؛ System.out.println (tz.getId ()+":"+str) ؛ } / ** * اختبار APIs timezone الآخر * / public static void testOTherAPIS () {// المنطقة الزمنية الافتراضية tzone tz = timezone.getDefault () ؛ // GET "id" string id = tz.getId () ؛ // الحصول على "اسم العرض" اسم السلسلة = tz.getDisplayName () ؛ // الحصول على "إزاحة الوقت". الإزاحة بالنسبة إلى "خط الطول الأساسي" هو MS. int الإزاحة = tz.getRawoffset () ؛ // احصل على الساعة المقابلة من "إزاحة الوقت" int gmt = الإزاحة/(3600*1000) ؛ system.out.printf ("id = ٪ s ، name = ٪ s ، الإزاحة = ٪ s (ms) ، gmt = ٪ s/n" ، معرف ، الاسم ، الإزاحة ، gmt) ؛ } / ** * طباعة جميع المعرفات المدعومة من GetTimeZone (معرف السلسلة) * / public static void printalltimezones () {string [] ids = timezone.getavailableIds () ؛ لـ (معرف السلسلة: IDS) {// int roffset = timezone.getTimeZone (avaids [i]). getRawoffset () ؛ //system.out.println(i+ ""+avaids [i]+""+Offset/(3600 * 1000)+"/t") ؛ System.out.printf (id+"،") ؛ } system.out.println () ؛ }}
3. حول المنطقة الزمنية والمعايرة الزمنية
تتشابه جافا وسولاريس عندما يتعلق الأمر بمعلومات حول المناطق الزمنية. كل منطقة زمنية لديها معرف معرف المنطقة الزمنية. في J2SE 1.3 و 1.4 ، هذا المعرف عبارة عن سلسلة ، وهي قائمة بهذه المعرفات الموجودة في الدليل الفرعي 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. تقوم هذه الطريقة بإرجاع معلمة سلسلة كمعرف لمنطقة الوقت المطلوبة. يتم الحصول على معرف المنطقة الزمنية الافتراضية هذا من خاصية user.timezone (النظام). إذا لم يتم تعريف user.timezone ، فسوف يحاول الحصول على المعرف من خصائص user.country و java.home (النظام). إذا لم تجد بنجاح معرف المنطقة الزمنية ، فإنه يستخدم قيمة "GMT". بمعنى آخر ، إذا لم يحسب معرف المنطقة الزمنية الخاصة بك ، فسيستخدم GMT كمنطقة زمنية افتراضية.
لاحظ أن خاصية النظام تتم تهيئة في طريقة initproperties لفئة java.lang.system. هذه طريقة محلية. لذلك لا يتوفر رمز المصدر-إلا إذا كنت تقوم بالبحث في قاعدة التعليمات البرمجية المحلية في حزمة توزيع J2SE للدراسة. ومع ذلك ، في أنظمة Windows ، تتم تهيئة سمة النظام من سجل Windows ، بينما في Linux/Unix يتم تهيئتها بواسطة متغيرات البيئة. إعلان Javadoc لطريقة InitProperties ، يجب ضمان بعض الخصائص "لتعريفها" وإدراجها. من بين خصائص النظام الثلاثة التي تستخدمها طريقة getDefault لفئة java.util.timezone ، يتم سرد Java.home فقط في Javadoc كقرة "مضمونة".
الحلول الموصى بها:
لذا ، كيف تتأكد من أن Java يمنحك الوقت والتاريخ المناسب؟ أفضل طريقة هي التأكيد على أن فئة Timezone الافتراضية من الجهاز الظاهري Java (JVM) صحيحة ومناسبة لنطاقك الجغرافي (لغة). كيف تتأكد من أن المنطقة الزمنية الافتراضية صحيحة ومناسبة؟ هذه مشكلة جديدة أخرى. مثل معظم المشكلات التي تم التعامل معها ، فإن هذا له العديد من الحلول. وفقًا للرمز المصدري لطريقة 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" ، "Asia/Shanghai") ؛إذا لم يكن هناك معرف زمني متاح لك ، فيمكنك إنشاء منطقة زمنية مخصصة باستخدام طريقة setDefault لفئة java.util.timezone لتعيينها على الوقت الافتراضي منطقة-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
تذكر أنه في J2SE ، تحتوي معظم الفصول ذات الصلة بالوقت والوقت على معلومات المنطقة الزمنية ، بما في ذلك فئات التنسيق ، مثل java.text.dateformat ، لذلك تتأثر جميعًا بالمنطقة الزمنية الافتراضية لـ JVM. ومع ذلك ، عند إنشاء مثيلات من هذه الفئات ، يمكنك التأكد من معلومات المنطقة الزمنية الصحيحة لهم ، مما يسهل عليك تعيين المنطقة الزمنية الافتراضية لـ JVM بأكملها. وبمجرد إعداده ، يمكنك التأكد من أن جميع هذه الفئات ستستخدم نفس المنطقة الزمنية الافتراضية.