あなたの天然記念物
ホーム更新雑談Perl鉄ゲタランドナーコースガイド自転車Linuxリンク経歴連絡先

DateTimeで日時やエポック秒に変換 (2017.07.05)

背景

検索して見かけたこちらのページでDateTimeを使っていなかったので。
「DateTimeモジュールのinstallは依存関係が多くとても大変なのでTime::Piecesを使うと良いと思います。」
誰もが一度は陥る日付処理。各種プログラミング言語におけるDateTime型/TimeStamp型の変換方法のまとめ - Web就活日記

想像ですが「DateTime型」はISO8601を一部省略した文字列、「TimeStamp型」はエポック秒を指しているようです。
ISO 8601 - Wikipedia
UNIX時間 - Wikipedia
昔からあるCPANモジュール(サイトCPANにあるモジュール群ではなく「CPAN」という名前の依存関係を全自動で調べて一緒にインストールしてくれるモジュール)や、今時ならcpanmが便利だし、ActivePerlならPPMにお任せだよねという時代にDateTimeのインストールは楽勝だからDateTimeでどんなコードになるのだろうと思った訳です。
遊び半分で書いてる素人のスクリプトがPerl警察に検挙されそうで怖いです(笑)。

コード

UTF-8で保存してください。 必要なモジュールはPPMとcpanmでインストールしました。
#!/usr/bin/perl -w

use utf8;
use warnings;
use strict;
use open IO => ":utf8";

use feature ":5.10";

use DateTime;
use DateTime::Format::ISO8601;
use Encode::Locale;

binmode STDOUT, ":encoding(console_out)";

$| = 1;

my $dt1= DateTime->now(time_zone => "local");
say "現在時刻 ", $dt1;
say "ここのタイムゾーン ", $dt1->time_zone_long_name;
say "エポック秒 ", $dt1->epoch;
say "";

my $date = "2017-07-05T12:34:56";
say "読み取る文字列 ", $date;
my $time_zone = "Asia/Tokyo";
say "読み取るタイムゾーン ", $time_zone;
my $dt2 = DateTime::Format::ISO8601->parse_datetime($date);
$dt2->set_time_zone($time_zone);
say "読み取った日時 ", $dt2;
say "読み取ったタイムゾーン ", $dt2->time_zone_long_name;
say "エポック秒 ", $dt2->epoch;

exit;

結果

スクリプト単独ではなくperlから起動しています。 ActivePerl(Windows)とperlbrew(Linux)で同じ結果になりました。
現在時刻 2017-07-05T16:24:41
ここのタイムゾーン Asia/Tokyo
エポック秒 1499239481

読み取る文字列 2017-07-05T12:34:56
読み取るタイムゾーン Asia/Tokyo
読み取った日時 2017-07-05T12:34:56
読み取ったタイムゾーン Asia/Tokyo
エポック秒 1499225696