理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

twitter API で取得できる created_at のフォーマット

Twitter には様々な API が用意されていて、基本的な twitter クライアントがこの API を使って実装されているのはご存知の通りです。
例えばぼくが自分のタイムラインを取得するときは statuses/user_timeline API を用いれば良く、それによって複数Tweet の情報が返ってきます。この Tweet の情報には様々なものが含まれており、実際の Tweet の内容の他に、例えば呟いたユーザの情報だったり、呟かれた時間(created_at)だったりが入っています。

この Tweet の情報を DB に保存しておきたいなと思い、そういうプログラムを書いていた*1のですが、呟かれた時間が入っている created_at の解析で色々と迷ってしまいました。理由は、そのフォーマットにあります。
TwitterAPI から返却される日付のフォーマットは以下のようになっています。

Wed Apr 07 00:19:09 +0000 2010

これは RFC822 の日時のフォーマットに似てはいるのですが異なります。他にも ISO 系のフォーマットを探してみましたが、それでもない。できるだけ解析処理を書きたくなかったのですが、もう探す方がメンドくさくなった。

my %month = (
    Jan => 1, Feb => 2,  Mar =>  3, Apr =>  4,
    May => 5, Jun => 6,  Jul =>  7, Aug =>  8,
    Sep => 9, Oct => 10, Nov => 11, Dec => 12,
);
    
sub conv_iso8601 {
    my ($timestamp, $tz) = @_;

    my ($weekday, $monthname, $day, $time, $timezone, $year) = split /\s+/ => $timestamp;
    my ($hour, $minute, $second) = split /:/ => $time;

    # FIXME: Time::Piece? HTTP::Date?
    my $dt = DateTime->new(
        year      => $year,
        month     => $month{$monthname},
        day       => $day,
        hour      => $hour,
        minute    => $minute,
        second    => $second,
        time_zone => $timezone
    );
    
    $dt->set_time_zone( $tz ) if $tz;
    # iso8601 format
    return $dt->iso8601;
}

*1:単に DBIx::Skinny を使ってみたくなっただけ