scud(飛云小俠) http://www.jscud.com 轉載請注明來源/作者
rss中日期格式要求遵守rfc822規范,其中是這么寫的:
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是可以省略的,后面的時間是要求有時區的.
示例如下(以在中國的中文操作系統機器為例):
1.Tue, 16 Aug 2005 15:33:33 GMT
2.Tue, 16 Aug 2005 23:33:33 +0800
其實這個rfc822應該也是電子郵件內容格式的規范,找一個郵件看看內容,也可以看出,郵件的時間格式也是遵循這個規范的.
要輸入第一種格式,使用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)); } |
注意,其中設置了時區為GMT,否則會輸出:
Tue, 16 Aug 2005 23:33:33 CST
這里的CST意思是代表"中國時間",但是一經搜索,發現CST代表了好幾個時區,太讓人混亂了.而在RTF822里面,CST僅代表美國中部時間.所以如果使用SimpleDateFormat,要設置時區以GMT表示,否則容易讓人迷惑而且不知道是那個時區.
假設你在中國,想根據當地時間輸入復合當地時間的字符串,讓人一看就能明白文章的日期,那么就使用第二種格式.(我推薦使用第二種方式,當然你的頻道主要給外國朋友瀏覽登除外)
上面說到和郵件有關,于是我們看看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)); |
輸出結果為:
Tue, 16 Aug 2005 23:33:33 +0800 (CST)
如果設置了時區為GMT,則輸出:
Tue, 16 Aug 2005 15:33:33 +0000 (GMT)
可以看到相對RTF822而言,好像多了一個后面的時區的說明及其括號.不知道這到底是怎么回事?
在硬盤上查找一番,發現在JIRA程序和Confluence中的RSS里都使用了這個日期格式.
注意到這個不同,我瀏覽了一下outlook Express里面的郵件,發現兩種時間格式的郵件都存在,真是讓人迷惑,或許都可以吧,呵呵 :)
如果不想使用MailDateFormat的格式,那么就自己寫一個類來實現吧,例如
public class RssDateFormat extends MailDateFormat { public RssDateFormat() { applyPattern("EEE, d MMM yyyy HH:mm:ss ’XXXXX’"); } } |
這是最簡單的了,當然可以把MailDateFormat的源碼拿過來改改更好一點,還不用依賴JavaMail了. :)
至此,我的RSS中的日期終于正確而且讓我滿意了. :)