Rss 中日期格式的研究
scud(飛云小俠) http://www.jscud.com 轉(zhuǎn)載請(qǐng)注明來(lái)源/作者
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是可以省略的,后面的時(shí)間是要求有時(shí)區(qū)的.
示例如下(以在中國(guó)的中文操作系統(tǒng)機(jī)器為例):
1.Tue, 16 Aug 2005 15:33:33 GMT
2.Tue, 16 Aug 2005 23:33:33 +0800
其實(shí)這個(gè)rfc822應(yīng)該也是電子郵件內(nèi)容格式的規(guī)范,找一個(gè)郵件看看內(nèi)容,也可以看出,郵件的時(shí)間格式也是遵循這個(gè)規(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è)置了時(shí)區(qū)為GMT,否則會(huì)輸出:
Tue, 16 Aug 2005 23:33:33 CST
這里的CST意思是代表"中國(guó)時(shí)間",但是一經(jīng)搜索,發(fā)現(xiàn)CST代表了好幾個(gè)時(shí)區(qū),太讓人混亂了.而在RTF822里面,CST僅代表美國(guó)中部時(shí)間.所以如果使用SimpleDateFormat,要設(shè)置時(shí)區(qū)以GMT表示,否則容易讓人迷惑而且不知道是那個(gè)時(shí)區(qū).
假設(shè)你在中國(guó),想根據(jù)當(dāng)?shù)貢r(shí)間輸入復(fù)合當(dāng)?shù)貢r(shí)間的字符串,讓人一看就能明白文章的日期,那么就使用第二種格式.(我推薦使用第二種方式,當(dāng)然你的頻道主要給外國(guó)朋友瀏覽登除外)
上面說(shuō)到和郵件有關(guān),于是我們看看JavaMail包里面的javax.mail.internet.MailDateFormat,可以用來(lái)格式化日期:
(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è)置了時(shí)區(qū)為GMT,則輸出:
Tue, 16 Aug 2005 15:33:33 +0000 (GMT)
可以看到相對(duì)RTF822而言,好像多了一個(gè)后面的時(shí)區(qū)的說(shuō)明及其括號(hào).不知道這到底是怎么回事?
在硬盤上查找一番,發(fā)現(xiàn)在JIRA程序和Confluence中的RSS里都使用了這個(gè)日期格式.
注意到這個(gè)不同,我瀏覽了一下outlook Express里面的郵件,發(fā)現(xiàn)兩種時(shí)間格式的郵件都存在,真是讓人迷惑,或許都可以吧,呵呵 :)
如果不想使用MailDateFormat的格式,那么就自己寫一個(gè)類來(lái)實(shí)現(xiàn)吧,例如
public class RssDateFormat extends MailDateFormat { public RssDateFormat() { applyPattern("EEE, d MMM yyyy HH:mm:ss ’XXXXX’"); } } |
這是最簡(jiǎn)單的了,當(dāng)然可以把MailDateFormat的源碼拿過(guò)來(lái)改改更好一點(diǎn),還不用依賴JavaMail了. :)
至此,我的RSS中的日期終于正確而且讓我滿意了. :)
posted on 2005-08-17 18:11 Scud(飛云小俠) 閱讀(1309) 評(píng)論(1) 編輯 收藏 所屬分類: Java