Twitterの投稿時刻は投稿してから24時間以内は"約○○前"のように現在との時間差で表示されます。
ログインしていない場合、1日以上経過しているつぶやき時刻は日本との時差がなぜか17時間(PSTの場合。PDTの時期は16時間)もあります。
"約○○前"の表示はあまり好きではありませんし、自分のつぶやき時刻が17時間もずれて表示されているとびっくりしてしまいます。
そこでPerlで時刻の表示を一律 %Y/%m/%d %H:%M:%S の形式に変更しようと思いました。
使用する環境はUbuntu 9.10 Karmic koalaです。
目をつけたのは、下記の data="{time: の後ろの文字列です。
<span class="published timestamp" data="{time:'Tue Mar 16 12:44:41 +0000 2010'}">約1時間前</span>
"perl Datetime"で検索すると、結構たくさんのモジュールが引っかかるのですが、どれを使えばよいのかわかりません。
とりあえず、DateTime::Format::W3CDTF と DateTime::Format::Mail を試したのですが、うまくいきません。
検索条件をいろいろ変えてみて、Twitter のStreaming APIにおける日時表現の解析についてというサイトに行き着きました。
DateTime::Format::DateParse で可能と書いてありました。私が扱おうとしているのはStreaming APIではないのですが、時刻の形式は一緒です。
DateTime::Format::DateParseは "libdatetime-format-dateparse-perl" パッケージに含まれています。
依存関係は
Depends: perl (>= 5.6.0-16), libdatetime-timezone-perl (>= 0.27), libdatetime-perl (>= 0.29), libtimedate-perl (>= 1.16)
Manpageをみると
SYNOPSIS use DateTime::Format::DateParse; my $dt = DateTime::Format::DateParse->parse_datetime( $date ); my $dt = DateTime::Format::DateParse->parse_datetime( $date, $zone );
DateTime::Format::DateParseを先日のtw_rev.plに組み込むと下記のようになります。
tw_rev2.pl
#!/usr/bin/perl use DateTime; use DateTime::Format::DateParse; my $tzhere = DateTime::TimeZone->new( name => 'local' ); sub repTime { my $gmt = shift; $dt = DateTime::Format::DateParse->parse_datetime($gmt); $dt->set_time_zone($tzhere); return $dt->strftime('%Y/%m/%d %H:%M:%S'); } # search start html header while(<>){ print; last if m#<head>#; } # For relative link. ex list in right side. print qq(<base href="http://twitter.com/" />\n); # search start of tweets while(<>){ print; last if m#<ol id='timeline' class='statuses'>#; } # stack each tweets my(@TWEET); OUTER: while(1){ my(@tweet); while(<>){ last OUTER if m#</ol>#; s#(<span class="published timestamp" data="{time:'([^']+)'}">)[^<]+</span>#$1 . repTime($2) . "</span>"#e; push @tweet, $_; last if m#</li>#; } unshift @TWEET, \@tweet; } # output each tweets my($tweet); for $tweet (@TWEET){ my($line); for $line (@$tweet){ print $line; } } print qq(</ol>\n); # output remaining while(<>){ print; }
0 件のコメント:
コメントを投稿