読者です 読者をやめる 読者になる 読者になる

M.C.P.C. (Mamesibori Creation Plus Communication)

印刷屋から五反田のWeb屋に転職したCLのブログです。

TwitterのAPIから得られる日付文字列をPerlのTime::PieceでParseする

Perl WebAPI Twitter

Perlの日付を処理するモジュールはTime::PieceがいいよーなぜならばDateTimeは遅いから、ていう話なので、Twitter APIから出てくる日付文字列をTime::Pieceによるパースで一発処理する方法。strptime用のテンプレート表記するのがダサいなーとか思っていたけど、追加モジュール入れなくていいのは正義だよね。

use strict;
use warnings;
use Time::Piece;
my $tw = { created_at => "Sat Aug 01 01:56:26 +0000 2009", }; # Twitter APIの日付文字列
my $tp = localtime Time::Piece->strptime( $tw->{created_at}, "%a %b %d %T %z %Y")->epoch;
print $tp->datetime."\n"; # 2009-08-01T10:56:26 (ISO 8601)

タイムゾーンをうまく処理するためにいったんエポック起点のUNIX秒にしてlocaltimeにぶっこむ件は、 http://blog.dtpwiki.jp/dtp/2012/02/perldatetimetim.html で自分で書いてたやつを参照。

参考:過去に書いたPerlで日付をパースするモノたち

日付関連の処理は僕自身、過去にも結構やっていたみたい。

Twitter APIの日付文字列をDateTimeに食わせる

DateTime::Format::HTTPのパーサでDateTimeのオブジェクトにしちゃおうという案。しかし、DateTime::Format::HTTPは+0000形式の時差表記が理解できないので、GMTに無理やり置換することで対処。スマートではないよね。

TwitterのAPIから得られる日付文字列をPerlのDateTimeでParseする - M.C.P.C.

use strict;
use warnings;
use DateTime::Format::HTTP;
my $tw = { created_at => "Sat Aug 01 01:56:26 +0000 2009", }; # Twitter APIの日付文字列
(my $timestamp = $tw->{created_at}) =~ s|\+0000|GMT|;
  # DateTime::Format::HTTPは+0000形式のタイムゾーン認識しない
my $dt = DateTime::Format::HTTP
         -> parse_datetime( $timestamp ) # GMTタイムゾーン確定
         -> set_time_zone('local'); # 現地時間タイムゾーンへ変換
                                    # 'Asia/Tokyo'のほうが処理速い
         # http://diary.lampetty.net/20061206.html#p01
         # http://blog.livedoor.jp/dankogai/archives/50708234.html
print "$dt\n"; # 2009-08-01T10:56:26 (ISO 8601)

Twitter APIの日付文字列をDate::Parseに食わせてからDateTimeに食わせる

何がいいかっていうと、気持ち悪いタイムゾーン文字列の置換とか、気持ち悪いstrptime用テンプレート文字列とかが無いので気持ちがすっきりすることです。でもこれからはググってこのページを表示させて最初のやつ見て使うだろうからもういらないよね。

DateTime::Format::HTTPがPDTのタイムゾーンを食えなかったでござる - M.C.P.C.

use strict;
use warnings;
use DateTime;
use Date::Parse;
my $tw = { created_at => "Sat Aug 01 01:56:26 +0000 2009", }; # Twitter APIの日付文字列
my $epoch = str2time($tw->{created_at});
my $dt = DateTime->from_epoch( epoch => $epoch )
         -> set_time_zone('local'); # 現地時間タイムゾーンへ変換
                                    # 'Asia/Tokyo'のほうが処理速い
         # http://diary.lampetty.net/20061206.html#p01
         # http://blog.livedoor.jp/dankogai/archives/50708234.html
print "$dt\n"; # 2009-08-01T10:56:26 (ISO 8601)

JavaScriptのDate.parse()用日付文字列を生成するため、UNIX秒をDateTime::Format::Mailに食わせる

JavaScriptDate.parse()でパース出来る文字列っていうのはブラウザごとにまちまちっていう一部で有名な話があって、それに対応するためにPerl側でなるべくどのブラウザのJavaScriptでも処理できるような日付文字列を用意しようという作戦。

DateTime::Format::Mailを使うのだけれども、DateTimeベースだから重い遅いということになります。新規に組むのならDateTimeベースのものはあまり使わないほうがよい。

PerlからJavaScriptに日付を渡すのにMojo::Dateを使う - M.C.P.C.

use strict;
use warnings;
use Date::Parse;
use DateTime;
use DateTime::Format::Mail;
my $tw = { created_at => "Sat Aug 01 01:56:26 +0000 2009", }; # Twitter APIの日付文字列
my $epoch = str2time($tw->{created_at});
my $dt =
  DateTime::Format::Mail->format_datetime( 
    DateTime->from_epoch( epoch => $epoch )
  );
print "$dt\n"; # Sat, 01 Aug 2009 01:56:26 -0000

JavaScriptのDate.parse()用日付文字列を生成するため、UNIX秒をMojoliciousのMojo::Dateに食わせる

ひとつ前のを、Mojolicious組み込みのMojo::Dateでやってみる。Mojoliciousでサーバサイドを作る場合これでやる方法もあるのだけれども……

PerlからJavaScriptに日付を渡すのにMojo::Dateを使う - M.C.P.C.

use Mojo::Date;
use Date::Parse;
my $tw = { created_at => "Sat Aug 01 01:56:26 +0000 2009", }; # Twitter APIの日付文字列
my $epoch = str2time($tw->{created_at});
my $dt = Mojo::Date->new($epoch)->to_string;
print "$dt\n"; # Sat, 01 Aug 2009 01:56:26 GMT

JavaScriptに日付食わせるならUNIX秒で送ったほうが早い

ぎゃふん!