理系学生日記

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

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

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

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

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

|perl| 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 を使ってみたくなっただけ