Lingrの日付を変換

LingrはWeb上でラクにちゃっとできるので、良いですね。ただ、Lingrのログに流れるタイムスタンプってロサンゼルス時間なんですよね。これが微妙にきもくて、できれば、日本時間で表示してほしい。

とか友達と言っていたら、「それGreaseMonkeyでできるんじゃね?」という話の流れに。ただ、JavaScriptでタイムゾーン変換とかはいかにも面倒そうなので、Lingrのタイムスタンプ形式の文字列を受け取ってタイムゾーンを日本に変換して返すWebサービスを作りました。timeパラメータに"at 7:40am (March 24)"のようなLingrのログののタイムスタンプ文字列を渡して使います。


http://www.douzemille.net/labs/lingr_time.cgi?time=at%206%3A42am%20(March%2024)

非常に使いどころが限定されるんだけど、GreaseMonkeyスクリプトと組み合わせるとそれなりに便利です。それとなく、コードをペタリ。

use strict;
use warnings;
use CGI;
use Carp;
use DateTime;

# month table
my %month = (
    January   => 1,
    February  => 2,
    March     => 3,
    April     => 4,
    May       => 5,
    June      => 6,
    July      => 7,
    August    => 8,
    September => 9,
    October   => 10,
    November  => 11,
    December  => 12,
);
my %rev_month = map { $month{$_} => $_ } keys %month;

# print CGI header
my $q = CGI->new;
print $q->header(-type => 'text/plain');

# match the param 'time'
my $time_str = $q->param('time');
my ($h, $M, $ampm, $m, $d) =
    $time_str =~ m/^at \s* (\d+):(\d+) (am|pm) \s+ \((\w+)\s(\d+)\)$/xms;
croak "can't convert data" if !$h;

# convert time from Los to Tokyo
if ($ampm eq 'pm') { $h += 12; }

my $time = DateTime->now( time_zone => 'America/Los_Angeles');

$time->set_hour($h);
$time->set_minute($M);
$time->set_month($month{$m});
$time->set_day($d);

$time->set_time_zone('Asia/Tokyo');

# print new time
print 'at ' .
      $time->hour_12 .
      ':' .
      $time->minute .
      ($time->hour_1 < 12 ? 'am' : 'pm') .
      ' (' .
      $rev_month{$time->month}.
      ' ' .
      $time->day.
      ')';

ちょっと微妙な更新でしたが、とりあえずその日にやったことで、すこしでもネタになりそうならアウトプットしておこうと。最近更新が滞ってたので、そういう姿勢で更新頻度あげていきたいところです。