日付の parse 処理で落ちちゃう[AIR/Flex]
(2009-03-14 08:21:05) by shinoda


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;
}

あんまり良い手だとも思わないけど、取りあえずね、取りあえず。


コメント投稿
次の記事へ >
< 前の記事へ
TOPへ戻る

Powered by
MT4i 3.0.8