Rss 中日期格式的研究

          scud(飛云小俠) http://www.jscud.com 轉(zhuǎn)載請注明來源/作者

           

          rss中日期格式要求遵守rfc822規(guī)范,其中是這么寫的:

               date-time   =  [ day "," ] date time        ; dd mm yy
                                                           ;  hh:mm:ss zzz
          
               day         =  "Mon"  / "Tue" /  "Wed"  / "Thu"
                           /  "Fri"  / "Sat" /  "Sun"
          
               date        =  1*2DIGIT month 2DIGIT        ; day month year
                                                           ;  e.g. 20 Jun 82
          
               month       =  "Jan"  /  "Feb" /  "Mar"  /  "Apr"
                           /  "May"  /  "Jun" /  "Jul"  /  "Aug"
                           /  "Sep"  /  "Oct" /  "Nov"  /  "Dec"
          
               time        =  hour zone                    ; ANSI and Military
          
               hour        =  2DIGIT ":" 2DIGIT [":" 2DIGIT]
                                                           ; 00:00:00 - 23:59:59
          
               zone        =  "UT"  / "GMT"                ; Universal Time
                                                           ; North American : UT
                           /  "EST" / "EDT"                ;  Eastern:  - 5/ - 4
                           /  "CST" / "CDT"                ;  Central:  - 6/ - 5
                           /  "MST" / "MDT"                ;  Mountain: - 7/ - 6
                           /  "PST" / "PDT"                ;  Pacific:  - 8/ - 7
                           /  1ALPHA                       ; Military: Z = UT;
                                                           ;  A:-1; (J not used)
                                                           ;  M:-12; N:+1; Y:+12
                           / ( ("+" / "-") 4DIGIT )        ; Local differential
                                                           ;  hours+min. (HHMM)
          

           



          可以看出,前面的星期X是可以省略的,后面的時間是要求有時區(qū)的.

          示例如下(以在中國的中文操作系統(tǒng)機器為例):


           1.Tue, 16 Aug 2005 15:33:33 GMT
           2.Tue, 16 Aug 2005 23:33:33 +0800

          其實這個rfc822應(yīng)該也是電子郵件內(nèi)容格式的規(guī)范,找一個郵件看看內(nèi)容,也可以看出,郵件的時間格式也是遵循這個規(guī)范的.

          要輸入第一種格式,使用SimpleDateFormat格式化即可,代碼如下

              public static void test1(Date date)
              {
                  SimpleDateFormat sdfTemp = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z",Locale.US);
                 
                  SimpleTimeZone aZone = new SimpleTimeZone(8,"GMT");       
                  sdfTemp.setTimeZone(aZone);
                 
                  System.out.println(sdfTemp.format(date));       
              } 

          注意,其中設(shè)置了時區(qū)為GMT,否則會輸出:

           Tue, 16 Aug 2005 23:33:33 CST

          這里的CST意思是代表"中國時間",但是一經(jīng)搜索,發(fā)現(xiàn)CST代表了好幾個時區(qū),太讓人混亂了.而在RTF822里面,CST僅代表美國中部時間.所以如果使用SimpleDateFormat,要設(shè)置時區(qū)以GMT表示,否則容易讓人迷惑而且不知道是那個時區(qū).

          假設(shè)你在中國,想根據(jù)當?shù)貢r間輸入復(fù)合當?shù)貢r間的字符串,讓人一看就能明白文章的日期,那么就使用第二種格式.(我推薦使用第二種方式,當然你的頻道主要給外國朋友瀏覽登除外)

          上面說到和郵件有關(guān),于是我們看看JavaMail包里面的javax.mail.internet.MailDateFormat,可以用來格式化日期:
          (MyEclipse 3.8.4附帶的J2EE 1.3中的JavaMail包)

                  MailDateFormat mdf = new MailDateFormat();
                 
                  SimpleTimeZone aZone = new SimpleTimeZone(8,"GMT");       
                  //mdf.setTimeZone(aZone);      
                 
                  System.out.println(mdf.format(date));        

          輸出結(jié)果為:

           Tue, 16 Aug 2005 23:33:33 +0800 (CST)
           
          如果設(shè)置了時區(qū)為GMT,則輸出:

           Tue, 16 Aug 2005 15:33:33 +0000 (GMT) 
           
           
           
          可以看到相對RTF822而言,好像多了一個后面的時區(qū)的說明及其括號.不知道這到底是怎么回事?

          在硬盤上查找一番,發(fā)現(xiàn)在JIRA程序和Confluence中的RSS里都使用了這個日期格式. 

          注意到這個不同,我瀏覽了一下outlook Express里面的郵件,發(fā)現(xiàn)兩種時間格式的郵件都存在,真是讓人迷惑,或許都可以吧,呵呵 :)

          如果不想使用MailDateFormat的格式,那么就自己寫一個類來實現(xiàn)吧,例如

           public class RssDateFormat extends MailDateFormat
           {
               public RssDateFormat()
               {
                   applyPattern("EEE, d MMM yyyy HH:mm:ss ’XXXXX’");       
               }
           
           } 

           
          這是最簡單的了,當然可以把MailDateFormat的源碼拿過來改改更好一點,還不用依賴JavaMail了. :)

          至此,我的RSS中的日期終于正確而且讓我滿意了. :)

           


           

          posted on 2005-08-17 18:11 Scud(飛云小俠) 閱讀(1305) 評論(1)  編輯  收藏 所屬分類: Java

          評論

          # re: Rss 中日期格式的研究 2005-08-18 22:09 scud

          注意:jdk1.4的SimpleDateFormat已經(jīng)支持RTF822的格式了,也就是最后一部分時區(qū)的字符串+/-0800,jdk1.3的不支持.
            回復(fù)  更多評論   

          <2005年8月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導(dǎo)航

          統(tǒng)計

          公告

          文章發(fā)布許可
          創(chuàng)造共用協(xié)議:署名,非商業(yè),保持一致

          我的郵件
          cnscud # gmail


          常用鏈接

          留言簿(15)

          隨筆分類(113)

          隨筆檔案(103)

          相冊

          友情鏈接

          技術(shù)網(wǎng)站

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 嘉禾县| 泸水县| 泗阳县| 米易县| 光泽县| 蒙城县| 五指山市| 阿克陶县| 商丘市| 哈尔滨市| 新密市| 广丰县| 金山区| 邹城市| 常州市| 澄城县| 日照市| 榆社县| 柯坪县| 郯城县| 嘉义市| 洪泽县| 札达县| 宁都县| 阿坝县| 军事| 峨眉山市| 通化市| 绿春县| 三江| 宿州市| 玉山县| 阳江市| 广南县| 乐亭县| 平遥县| 大关县| 修武县| 休宁县| 科技| 开阳县|