特定の時刻フォーマットの読み込みと変換を行うモジュール
時間は,
POSIX::strftime ──任意の時刻フォーマットへの変換モジュール
単に現在時間を任意の時刻フォーマットに変換するためにTime::Piece
モジュールやDatetime
モジュールをuse
することは,
POSIX::strftime
localtime
関数を渡すことで,localtime
関数のリストで返される結果と同じ順で直接指定することでも,
use POSIX qw(strftime);
my $now_string = strftime "%a %b %e %H:%M:%S %Y", localt
ime;
Time::Local::timelocal_posix ──UNIX時間に戻すモジュール
同様に,Time::Piece
モジュールやDatetime
モジュールは,
Time::Local::timelocal_
$month
と$year
は,localtime
関数と同じ0~11の範囲と1900を引いた値をTime::Local::timelocal_
に渡します。
use Time::Local qw(timelocal_posix);
my ($sec, $min, $hour, $mday, $month, $year) = (0, 0, 0, 1, 0, 121);
my $epoch = timelocal_posix($sec, $min, $hour, $mday, $month, $year);
HTTP::Date::parse_date ── 日付変換ルーチンモジュール
文字列の日付は,localtime
関数などさまざまな種類があり,
HTTP::Date::parse_
use HTTP::Date qw(parse_date);
my ($year, $month, $day, $hour, $min, $sec, $tz) = parse_date('Fri, 01 Jan 2021 00:00:00 GMT');
my $parsed_time = parse_date('Fri, 01 Jan 2021 00:00:00 GMT');
say $parsed_time;
同類のモジュールとして,DateTime
オブジェクトにするDateTime::Format::HTTP
モジュールなどもあります。
Time::Piece::MySQL ──Time::Piece用MySQL日付モジュール
MySQLで時間を扱うのは少々大変です。たとえば,
Time::Piece
モジュールの代わりにTime::Piece::MySQL
モジュールuse
することで,Time::Piece
オブジェクトとしてMySQLの時刻フォーマットの相互変換がメソッドで可能になります。
use Time::Piece::MySQL;
my $now = localtime;
# DATETIME型への変換
say $now->mysql_datetime;
my $mysql_datetime = '2021-01-01 00:00:00';
# DATETIME型からの変換
my $time = Time::Piece->from_mysql_datetime($mysql_datetime);
DateTime::Format::MySQL ──DateTime用MySQL日付モジュール
DateTime
モジュールでもMySQLの相互変換が行えます。DateTime
モジュールの代わりにDateTime::Format::MySQL
モジュールuse
することで利用できます。
use DateTime::Format::MySQL;
# DATETIME型からの変換
my $dt = DateTime::Format::MySQL->parse_datetime('2021-01-01 00:00:00');
# DATETIME型への変換
say DateTime::Format::MySQL->format_datetime($dt);
Test::MockTime ──ユニットテストでの時間固定モジュール
ユニットテストでプログラムの実行日時を変えたいときがあります。たとえば特定の時間になるとタイムセールが始まるコードがマシンの時間に依存していた場合,Test::MockTime
モジュールtime
関数が返すUNIX時間を修正してテストを行えます。
set_
関数にUNIX時間を渡すと,time
関数の戻り値が固定化されます。日時を文字列で渡す場合でも,restore_
関数を呼び出すだけです。
use Test::MockTime qw(set_fixed_time restore_time);
set_fixed_time(1609426800);
set_fixed_time('2021-01-01 00:00:00', '%Y-%m-%d %H:%M:%S');
restore_time();
逆に,set_
関数に値を渡すか,set_
関数で現在時間から見た秒数を指定して,
use Test::MockTime qw(set_absolute_time set_relative_time restore_time);
set_absolute_time(0);
restore_time();
set_relative_time(-600); # 600秒前に時間を戻す
restore_time();
まとめ
本稿では,
さて,
本誌最新号をチェック!
WEB+DB PRESS Vol.129
2022年6月24日発売
B5判/
定価1,628円
ISBN978-4-297-12890-6
- 特集1
Reactの深層
最新バージョンから読み解く! 変わる常識と変わらない思想 - 特集2
できるところから無理なく導入!
小さく始めるデザインシステム - 特集3
最新レコメンドエンジン総実装
協調フィルタリングから深層学習まで