ActionScript3 で RSS リーダーを作成したのだが、ある特定のサイトの RSS フィードを受信すると、
var feed:IFeed = FeedFactory.getFeedByString(loader.data);
var items:Array = feed.items;
for each(var item:IItem in items){
RssTitle.push(item.title);
RssLink.push(item.link);
RssDate.push(item.date);
}
と、item.date を参照しているところで、
Error: Unable to parse the string [2009-03-11T112033] into a date. The internal error was: Error: This date does not conform to W3CDTF.
というエラーを出して落ちる。
世の中に出回っている他の RSS リーダーでは問題なく処理されているフィードなので、こちらのプログラムに問題があるのかと悩んだが、どうも、メッセージどおりに、このフィードの作成日付(例:<dc:date>2009-03-11T112033</dc:date>)が正しく W3CDTF 形式になっていないのが悪いと結論づけていいようだ。
W3C のサイトで W3CDTF 形式をチェックしたが、
http://www.w3.org/TR/NOTE-datetime
Year:
YYYY (eg 1997)
Year and month:
YYYY-MM (eg 1997-07)
Complete date:
YYYY-MM-DD (eg 1997-07-16)
Complete date plus hours and minutes:
YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
Complete date plus hours, minutes and seconds:
YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
Complete date plus hours, minutes, seconds and a decimal fraction of a second:
YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)
ということで、明らかに「2009-03-11T112033」という書き方は間違いだ。正しくは、「2009-03-11T11:20:33+09:00」だね。
ということで、当方で作成した RSS リーダー側の挙動で基本的に問題はないようだが、他の RSS リーダーで上記のような「中途半端に W3CDTF 形式に似た形式」を処理してるのに、うちのプログラムでは落ちるというのも仄かな悔しさが漂うなあ・・・(^^;
取りあえず、今回の形式だけは、DateUtil.as を修正して「強引に」対応しておいた。
(具体的には、DateUtil.as 中の parseW3CDTF 関数に、以下の記述を追加)
var nonColTime:RegExp = /^(\d{2})(\d{2})(\d{2})/s;
var matchText:Object = nonColTime.exec(offsetStr);
if (matchText != null) {
timeStr = offsetStr;
hour = matchText[1];
minutes = matchText[2];
seconds = matchText[3];
offsetHours = 0;
offsetMinutes = 0;
}
あんまり良い手だとも思わないけど、取りあえずね、取りあえず。