posts - 89,  comments - 98,  trackbacks - 0

          What's your time zone?

          JAVA日期和時(shí)間類徹底解決(3)

          Page 3 of 3

          時(shí)間區(qū)域和JAVA 
          涉及有關(guān)時(shí)間區(qū)域信息時(shí)Java和Solaris很相似。每個(gè)時(shí)間區(qū)域都有一個(gè)時(shí)間區(qū)域ID標(biāo)識(shí)符。在J2SE 1.3 and 1.4中,這個(gè)ID是個(gè)字符串,是由位于J2SE 安裝程序的jre/lib子目錄中的tzmappings文件這些ID列表。 J2SE 1.3 僅僅只包含tzmappings文件,但是 J2SE 1.4包含世界不同地區(qū)的時(shí)間區(qū)域數(shù)據(jù)文件。jre/lib/zi存放著這些文件。在J2SE 1.4里,sun.util.calendar.ZoneInfo從這些文件獲取DST規(guī)則。在Solaris中, 這些時(shí)間區(qū)域數(shù)據(jù)文件是以二進(jìn)制形式存放的,不是文本文件,因此你不能看它們。 在J2SE 1.4中的時(shí)間區(qū)域數(shù)據(jù)文件和在Solaris中是不同的。

          java.util.TimeZone類getDefault方法的源代碼顯示,它最終是會(huì)調(diào)用sun.util.calendar.ZoneInfo類的getTimeZone 方法。這個(gè)方法為需要的時(shí)間區(qū)域返回一個(gè)作為ID的String參數(shù)。這個(gè)默認(rèn)的時(shí)間區(qū)域ID是從 user.timezone (system)屬性那里得到。如果user.timezone沒有定義,它就會(huì)嘗試從user.countryjava.home (System)屬性來得到ID。 如果它沒有成功找到一個(gè)時(shí)間區(qū)域ID,它就會(huì)使用一個(gè)"fallback" 的GMT值。換句話說, 如果它沒有計(jì)算出你的時(shí)間區(qū)域ID,它將使用GMT作為你默認(rèn)的時(shí)間區(qū)域。

          注意,System屬性是在java.lang.System類的initProperties方法中被初始化的。這是一個(gè)本地方法。因此源代碼是不可用的----除非你深入到J2SE分發(fā)包中的本地代碼庫(kù)中去研究。然而,在Windows系統(tǒng)中,System 屬性是從Windows注冊(cè)表中被初始化的,而在Linux/Unix中是由環(huán)境變量來進(jìn)行初始化。initProperties方法的Javadoc聲明,某些屬性"必須保證被定義" 且列出它們。被java.util.TimeZone類的getDefault方法使用的三個(gè)System屬性中,只有java.home作為一種“保證的”屬性在Javadoc中被列出。

          推薦的解決方案
          因此,你如何確保JAVA能給你正確的時(shí)間和日期呢?以我的觀點(diǎn),最好的辦法是確認(rèn)JAVA虛擬機(jī)(JVM)的默認(rèn)TimeZone類是正確的,且是適合你的地理范圍(Locale)的。你如何來確保默認(rèn)TimeZone是正確的且適合的呢?這又是一個(gè)新問題了。象大多數(shù)處理的問題一樣,這個(gè)也有許多解決方案。根據(jù)java.util.TimeZone.getDefault方法的源代碼來看,最好的辦法是正確地設(shè)置user.timezone屬性。在啟動(dòng)JAVA虛擬機(jī)時(shí),你能很容易的通過使用 -D 命令 -line 參數(shù)的辦法來覆蓋(override)在java.lang.System.initProperties方法中所設(shè)置的值。例如:

          java -Duser.timezone=Asia/Jerusalem DateTest

          這個(gè)命令啟動(dòng)DateTest類(在這個(gè)文章開頭被列出的),并設(shè)置 user.timezone屬性到Asia/Jerusalem。你也能夠通過使用java.lang.System 類的setProperty方法來設(shè)置user.timezone 屬性:

          System.setProperty("user.timezone","Asia/Jerusalem");

          如果沒有一個(gè)可用的時(shí)間區(qū)域ID適合你,那么就你可以創(chuàng)建一個(gè)自定義TimeZone 使用java.util.TimeZone 類的 setDefault 方法將它設(shè)置為默認(rèn)的時(shí)間區(qū)域----就象我先前在ItsInitializer 類中所做的操作一樣。

          記住,在J2SE中,大多數(shù)日期和時(shí)間相關(guān)的類都包含時(shí)間區(qū)域信息,包括那些格式類,如java.text.DateFormat, 因此它們都會(huì)被JVM的默認(rèn)時(shí)間區(qū)域所影響。然而,在你創(chuàng)建這些類的實(shí)例時(shí),你能為它們確保正確的時(shí)間區(qū)域信息,使得你可以更容易來設(shè)置整個(gè)JVM的默認(rèn)時(shí)間區(qū)域。并且一旦設(shè)置好,就可以確保所有的這些類都將使用同一個(gè)默認(rèn)的時(shí)間區(qū)域。但是,古語(yǔ)云,“事事難料”。

          所以,努力接觸并馴服這些JAVA日期/時(shí)間類吧!

          posted on 2006-02-18 09:33 水煮三國(guó) 閱讀(478) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2006年2月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627281234
          567891011

          常用鏈接

          留言簿(4)

          隨筆分類(85)

          隨筆檔案(89)

          文章分類(14)

          文章檔案(42)

          收藏夾(37)

          java

          oracle

          Sybase

          搜索

          •  

          積分與排名

          • 積分 - 211137
          • 排名 - 265

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 尼玛县| 上饶县| 井陉县| 墨竹工卡县| 临夏市| 团风县| 忻城县| 永年县| 威宁| 呈贡县| 高唐县| 连城县| 邵武市| 清水河县| 清涧县| 枝江市| 洪洞县| 鹤庆县| 会昌县| 山丹县| 金坛市| 恭城| 闸北区| 信阳市| 陆良县| 西乌| 会同县| 扶绥县| 图木舒克市| 潜江市| 贵定县| 陇川县| 尼木县| 吉木乃县| 岳普湖县| 乡宁县| 梓潼县| 叙永县| 辉南县| 娄烦县| 鲁甸县|