TwitterのAPIから得られる日付文字列をPerlのTime::PieceでParseする
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に食わせる
JavaScriptのDate.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秒で送ったほうが早い
ぎゃふん!