昨日のエントリのように ISO8601形式であれば日付の解析が
行えたが、RSSにある pubDateの形式の場合はなぜかうまくいかない
Time::Pieceモジュールに含まれる Piece.xsを確認したところ、
Cライブラリの strptimeを呼び出しているだけであったので、
C言語でとりあえずうまくいくかを確認してみた
#include <stdio.h> #include <time.h> int main (int argc, char *argv[]) { struct tm time; char *ptr; char buf[1024]; char date[] = "Sun, 07 Oct 2007 01:49:43 +0900"; char format[] = "%a, %d %b %Y %T +0900"; ptr = strptime(date, format, &time); if (ptr == NULL) { fprintf(stderr, "Error\n"); return -1; } strftime(buf, sizeof(buf), "%FT%T", &time); printf("%s\n", buf); // 2007-10-07T01:49:43 return 0; }
期待する値が表示された。
一方Perlで同じ意味のコードを試してみる.
#!/usr/bin/perl use strict; use warnings; use Time::Piece; my $pub_time1 = 'Sun, 07 Oct 2007 01:49:43 +0900'; my $format = '%a, %d %b %Y %T +0900'; my $t3 = Time::Piece->strptime($pub_time1, $format); print $t3->strftime();
この場合 "Error parsing time"と出て解析ができない。
Piece.xsを確認すると実際の呼び出しは下記のようになっている。
#ifdef HAS_STRPTIME remainder = (char *)strptime(string, format, &mytm); #else remainder = (char *)strptime(aTHX_ string, format, &mytm); #endif
動作環境に HAS_STRPTIMEがあればライブラリ関数の strptimeを呼び出し、
そうでなければ同ファイルで定義したオリジナルの strptimeを使う
ようになっている。 UNIX環境であればライブラリ関数の方が呼び出される。
となると, 上記の Perlコードは成功するはずなんだけどね。
どこかおかしいんだろうか?調査する必要があります。