笔记 by 车东

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

· Feed | RSS

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

2007-05-15T14:49:00**.000**+08:00

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

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](http://www.chedong.com/blog/archives/000128.html)吧?文章发表时间有必要精确到毫秒吗?我找到的atom的相关规范是按照[ISO 8601](http://www.w3.org/TR/NOTE-datetime)格式,也就是:2007-05-15T14:49:00+08:00

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

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

💬 历史评论

以下 1 条评论从旧版 Movable Type 博客迁移而来。 原始评论时间:2002–2016 年。

Platinum · 2007-05-16 13:32

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 是个挺变态的函数,基本上什么写法都能识别