飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

RSS2.0标准时间pubDate的格式问题

Author:Flymorn Source:飘易博客
Categories:Asp编程 PostTime:2008-2-23 11:21:35
正 文:
   对于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个小时。举例说明,我的博客的feed的rss地址是:http://www.piaoyi.org/rss.asp,某文章的发表时间是Fri, 22 Feb 2008 15:49:18 GMT;在Feedsky烧制的页面是:http://feed.piaoyi.org/,然而这里的时间却提前了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"),就可以了,问题解决了。如果你对本博客感兴趣,欢迎订阅我们的内容
作者:Flymorn
来源:飘易博客
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:Feedsky网站首页再次打不开了
下一篇:网站IIS日志:百度蜘蛛抓取的HTTP状态“200 0 64”分析
2条评论 “RSS2.0标准时间pubDate的格式问题”
2011-4-2 13:29:00
我的博客的rss在网站管理员中总是有“发现无效日期。请修正日期或格式,然后重新提交。
父标记: item
标记: pubDate
值: Wed, 30 Nov -0001 00:00:00  0000
检测到问题的日期: 2011-4-1
459
日期无效
发现无效日期。请修正日期或格式,然后重新提交。
父标记: item
标记: pubDate
值: Wed, 30 Nov -0001 00:00:00  0000
检测到问题的日期: 2011-4-1"这样的标记,麻烦还有有道阅读对我的文章抓取根本是乱套的,前几天还是文章反复的重新抓取,导致旧的在新的前面,并且反复出现,现在是重复抓取,不过好像现在抓取了,以前抓取的就被删除了。
www.yayaus.com/feed,希望能帮我看一下哪里出了问题~~
2 飘易
2011-4-2 19:35:43
yaya:
你的 <pubDate>Fri, 01 Apr 2011 02:51:38  0000</pubDate>   除了时区不对,其他都是对的。
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
© 2007-2010 飘易博客 Www.Piaoyi.Org 原创文章版权由飘易所有 渝ICP备07006361号