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