詳解Java中的時區類TimeZone的用法。本站提示廣大學習愛好者:(詳解Java中的時區類TimeZone的用法)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java中的時區類TimeZone的用法正文
1、TimeZone 簡介
TimeZone 表現時區偏移量,也能夠盤算夏令時。
在操作 Date, Calendar等表現日期/時光的對象時,常常會用到TimeZone;由於分歧的時區,時光分歧。
上面說說TimeZone對象的 2種經常使用創立方法。
1.獲得默許的TimeZone對象
應用辦法:
TimeZone tz = TimeZone.getDefault()
2.應用 getTimeZone(String id) 辦法獲得TimeZone對象
應用辦法:
// 獲得 “GMT+08:00”對應的時區 TimeZone china = TimeZone.getTimeZone("GMT+:08:00"); // 獲得 “中國/重慶”對應的時區 TimeZone chongqing = TimeZone.getTimeZone("Asia/Chongqing");
關於 getTimeZone(String id) 這類方法支撐的全體id參數的取值,可以經由過程以下方法查找:
String[] ids = TimeZone.getAvailableIDs(); for (String id:ids) System.out.printf(id+", ");
輸入成果:
Etc/GMT+12, Etc/GMT+11, Pacific/Midway, Pacific/Niue ....等等例如,創立下面第2個打印值“Etc/GMT+11”對應的TimeZone。辦法以下:
TimeZone tz = TimeZone.getTimeZone("Etc/GMT+11"); TimeZone的函數接口 // 結構函數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 time) synchronized static void setDefault(TimeZone timeZone) void setID(String id) abstract void setRawOffset(int offsetMillis) abstract boolean useDaylightTime()
2、TimeZone示例:
上面經由過程示例演示在Date中應用TimeZone。
參考代碼以下(TimeZoneTest.java):
import java.text.DateFormat; import java.util.Date; import java.util.TimeZone; /** * TimeZone的測試法式 */ public class TimeZoneTest { public static void main(String[] args) { // 測試創立TimeZone對象的3種辦法 showUsageOfTimeZones() ; // 測試TimeZone的其它API testOtherAPIs() ; // 打印getTimeZone(String id)支撐的一切id //printAllTimeZones() ; } /** * 測試創立TimeZone對象的3種辦法 */ public static void 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 static void printDateIn(TimeZone tz) { // date為2013-09-19 14:22:30 Date date = new Date(113, 8, 19, 14, 22, 30); // 獲得默許的DateFormat,用於格局化Date DateFormat df = DateFormat.getInstance(); // 設置時區為tz df.setTimeZone(tz); // 獲得格局化後的字符串 String str = df.format(date); System.out.println(tz.getID()+" :"+str); } /** * 測試TimeZone的其它API */ public static void testOtherAPIs() { // 默許時區 TimeZone tz = TimeZone.getDefault(); // 獲得“id” String id = tz.getID(); // 獲得“顯示稱號” String name = tz.getDisplayName(); // 獲得“時光偏移”。絕對於“本初子午線”的偏移,單元是ms。 int offset = tz.getRawOffset(); // 獲得“時光偏移” 對應的小時 int gmt = offset/(3600*1000); System.out.printf("id=%s, name=%s, offset=%s(ms), gmt=%s\n", id, name, offset, gmt); } /** * 打印getTimeZone(String id)支撐的一切id */ public static void printAllTimeZones() { String[] ids = TimeZone.getAvailableIDs(); for (String id:ids) { //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、關於TimeZone和時光校准
觸及有關時光區域信息時Java和Solaris很類似。每一個時光區域都有一個時光區域ID標識符。在J2SE 1.3 and 1.4中,這個ID是個字符串,是由位於J2SE 裝置法式的jre/lib子目次中的tzmappings文件這些ID列表。 J2SE 1.3 僅僅只包括tzmappings文件,然則 J2SE 1.4包括世界分歧地域的時光區域數據文件。jre/lib/zi寄存著這些文件。在J2SE 1.4裡,sun.util.calendar.ZoneInfo從這些文件獲得DST規矩。在Solaris中, 這些時光區域數據文件是以二進制情勢寄存的,不是文本文件,是以你不克不及看它們。 在J2SE 1.4中的時光區域數據文件和在Solaris中是分歧的。
java.util.TimeZone類中getDefault辦法的源代碼顯示,它終究是會挪用sun.util.calendar.ZoneInfo類的getTimeZone 辦法。這個辦法為須要的時光區域前往一個作為ID的String參數。這個默許的時光區域ID是從 user.timezone (system)屬性那邊獲得。假如user.timezone沒有界說,它就會測驗考試從user.country和java.home (System)屬性來獲得ID。 假如它沒有勝利找到一個時光區域ID,它就會應用一個"fallback" 的GMT值。換句話說, 假如它沒有盤算出你的時光區域ID,它將應用GMT作為你默許的時光區域。
留意,System屬性是在java.lang.System類的initProperties辦法中被初始化的。這是一個當地辦法。是以源代碼是弗成用的----除非你深刻到J2SE分發包中的當地代碼庫中去研討。但是,在Windows體系中,System 屬性是從Windows注冊表中被初始化的,而在Linux/Unix中是由情況變量來停止初始化。initProperties辦法的Javadoc聲明,某些屬性"必需包管被界說" 且列出它們。被java.util.TimeZone類的getDefault辦法應用的三個System屬性中,只要java.home作為一種“包管的”屬性在Javadoc中被列出。
推舉的處理計劃 :
是以,你若何確保JAVA能給你准確的時光和日期呢?最好的方法是確認JAVA虛擬機(JVM)的默許TimeZone類是准確的,且是合適你的地輿規模(Locale)的。你若何來確保默許TimeZone是准確的且合適的呢?這又是一個新成績了。象年夜多半處置的成績一樣,這個也有很多處理計劃。依據java.util.TimeZone.getDefault辦法的源代碼來看,最好的方法是准確地設置user.timezone屬性。在啟動JAVA虛擬機時,你能很輕易的經由過程應用 -D 敕令 -line 參數的方法來籠罩(override)在java.lang.System.initProperties辦法中所設置的值。例如:
java -Duser.timezone=Asia/Shanghai DateTest
這個敕令啟動DateTest類,並設置 user.timezone屬性到Asia/Shanghai。你也可以或許經由過程應用java.lang.System 類的setProperty辦法來設置user.timezone 屬性:
System.setProperty("user.timezone","Asia/Shanghai");
假如沒有一個可用的時光區域ID合適你,那末就你可以創立一個自界說TimeZone 應用java.util.TimeZone 類的 setDefault 辦法將它設置為默許的時光區域----就象我先前在ItsInitializer 類中所做的操作一樣。
記住,在J2SE中,年夜多半日期和時光相干的類都包括時光區域信息,包含那些格局類,如java.text.DateFormat, 是以它們都邑被JVM的默許時光區域所影響。但是,在你創立這些類的實例時,你能為它們確保准確的時光區域信息,使得你可以更輕易來設置全部JVM的默許時光區域。而且一旦設置好,便可以確保一切的這些類都將應用統一個默許的時光區域。