MagpieRSS的parse_w3cdtf()函数对blogger atom格式的bug修正


很奇怪从Lilina上订阅的blogger.com发布的内容发布时间总是显示为未来8小时(格林威治)时间,一开始怀疑是atom输出的时区设置问题,但是看了atom.xml的输出,发现是有时区设置的,和其他引用的atom输出的主要区别在于发布时间有毫秒设置:

<published>2007-05-15T14:49:00.000+08:00</published>

Lilina是一个基于MagpieRSS的聚合工具,MagpieRSS中对于atom格式时间的解析是通过rss_utils.inc中的parse_w3cdtf()函数,当时可能没有考虑到秒后面还有毫秒,导致对后面的时区设置解析失败,变成了格林威治时间。修正后的正则表达式和代码如下:可以兼容解析其他标准的ISO 8601时间格式解析。

diff -r1.7 rss_utils.inc
28c28
<     $pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/";
---
>     $pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(\.\d{3})?(?:([-+])(\d{2}):?(\d{2})|(Z))?/";
43c43
<                 array( $match[8], $match[9], $match[10]);
---
>                 array( $match[9], $match[10], $match[11]);

 

给Blogger的问题:这个修改有些nerdly吧?文章发表时间有必要精确到毫秒吗?我找到的atom的相关规范是按照ISO 8601格式,也就是:2007-05-15T14:49:00+08:00

运行了一天,这个函数修正没有问题。

MagpieRSS项目已经hosting到了Google上:
http://code.google.com/p/magpiephp/ 

作者:车东 发表于:2007-05-16 11:05 最后更新于:2008-01-10 15:01
版权声明:可以转载,转载时请务必以超链接形式标明文章 的原始出处和作者信息及本版权声明

引用通告

以下是前来引用的链接: MagpieRSS的parse_w3cdtf()函数对blogger atom格式的bug修正:

» MagpieRSS在PHP5下解析atom时间戳出错问题的解决: gmmktime() expects parameter 3 to be long 来自 车东[Blog^2]
迟迟没有将服务器的PHP升级到php 5,就是很久以前发现有lilina有个bu... [阅读更多细节]

Comments

php -r "$a = '2007-05-15T14:49:00.123+12:00';$i = strtotime($a);echo date('Y-m-d H:i:s', $i);"

output:

2007-05-15 10:49:00
_______________________________

一个 PHP 内置的 strtotime 函数就通吃了,不需要自己写正则……

strtotime 是个挺变态的函数,基本上什么写法都能识别

发表一个评论

(如果你此前从未在此 Blog 上发表过评论,则你的评论必须在 Blog 主人验证后才能显示,请你耐心等候。)

Creative Commons License
此 Blog 中的日记遵循以下授权 Creative Commons(创作共用)授权.
Powered by
Movable Type 3.36