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 件のコメント:
コメントを投稿