読者です 読者をやめる 読者になる 読者になる

日付解析がうまくいかない

perl date c

昨日のエントリのように 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コードは成功するはずなんだけどね。
どこかおかしいんだろうか?調査する必要があります。