很奇怪从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/
版权声明:可以转载,转载时请务必以超链接形式标明文章 MagpieRSS的parse_w3cdtf()函数对blogger atom格式的bug修正 的原始出处和作者信息及本版权声明。
http://www.chedong.com/blog/archives/001337.html
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 是个挺变态的函数,基本上什么写法都能识别
由: Platinum 发表于 2007年05月16日 下午01时32分