小Tan工作室导航: 首页 博客 赛车 新闻 视频 游戏 音乐 小说 电视 下载 域名 邮箱 英文

RSS2.0中如何生成标准的pubDate格式

    在制作网站或博客的feed时,pubDate是一个非常重要的一项,它记录了文章发布的时间。这无论是对订阅者还是搜索引擎来说都是非常重要的。

    对于RSS2.0标准下的时间格式要求比较严格,必须遵守rfc822标准。比如<pubDate>Fri, 22 Feb 2008 15:49:18 GMT</pubDate>这样的格式。而一般的国内的服务器时间都是形如2008-2-22 15:49:18这样的格式,显然不满足标准,这也是导致很多feed读取不到文章发表时间的原因。

   在RSS1.0和ATOM当中,对于时间的格式并没有非常严格的规定,例如“2008-2-22 15:49:18”这样的格式是完全可以被识别的。但在RSS2.0中,这种时间格式就不能被识别。在ASP程序中,时间无法直接转换成满足rfc822标准的格式,所以很多博客系统直接采用了默认的时间格式。

   其实通过一个小函数,就可以完美转换符合标准的时间函数了。以下引用“呆若木鸡”写的一个函数:

引用内容 引用内容
'时间转换函数,符合rfc822标准
Function return_RFC822_Date(byVal myDate, byVal TimeZone)
Dim myDay, myDays, myMonth, myYear
Dim myHours, myMinutes, mySeconds  
myDate = CDate(myDate)
myDay = EnWeekDayName(myDate)
myDays = Right("00" & Day(myDate),2)
myMonth = EnMonthName(myDate)
myYear = Year(myDate)
myHours = Right("00" & Hour(myDate),2)
myMinutes = Right("00" & Minute(myDate),2)
mySeconds = Right("00" & Second(myDate),2)
return_RFC822_Date = myDay&", "& _
myDays&" "& _
myMonth&" "& _
myYear&" "& _
myHours&":"& _
myMinutes&":"& _
mySeconds&" "& _
" " & TimeZone
End Function
'星期转换函数
Function EnWeekDayName(InputDate)
Dim Result
Select Case WeekDay(InputDate,1)
Case 1:Result="Sun"
Case 2:Result="Mon"
Case 3:Result="Tue"
Case 4:Result="Wed"
Case 5:Result="Thu"
Case 6:Result="Fri"
Case 7:Result="Sat"
End Select
EnWeekDayName = Result
End Function
'月份转换函数
Function EnMonthName(InputDate)
Dim Result
Select Case Month(InputDate)
Case 1:Result="Jan"
Case 2:Result="Feb"
Case 3:Result="Mar"
Case 4:Result="Apr"
Case 5:Result="May"
Case 6:Result="Jun"
Case 7:Result="Jul"
Case 8:Result="Aug"
Case 9:Result="Sep"
Case 10:Result="Oct"
Case 11:Result="Nov"
Case 12:Result="Dec"
End Select
EnMonthName = Result
End Function


    通过上面的这个asp函数,就可以简单实现时间的转换。

   但是,这里一些博客系统的rss在Feedsky烧制后出现了问题。就是时间在烧制后提前了8个小时。举例说明,某文章的发表时间是Fri, 22 Feb 2008 15:49:18 GMT;在Feedsky烧制的页面中却提前了8小时,变成Fri, 22 Feb 2008 23:49:18 +0800。可以看出,Feedsky把GMT变成+0800,提前8个小时。

   看了一下rfc822标准里关于时区的解释:
引用内容 引用内容
   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)


    问题就出在了网站或博客的时间采用了GMT,而中国采用的时间是北京时间,即东8区。整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同,UTC与GMT含义完全相同。

    所以,只要把博客的时间采用东八区就可以了。可以调用这样的形式,return_RFC822_Date("&rs("时间字段")&","+0800"),就可以了,问题解决了。

    最后对像我一样的菜鸟们多说一句,函数在asp中需要用<%和%>注释,否则会直接显示在网页中,无意义。而调用时同样需要<%=return_RFC822_Date(...)%>才能输出值哦o(∩_∩)o...


文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: RSS pubDate
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.