この記事はPerl Advent Calendar 2022の6日目になります。
昨日は@nanto_viさん「Perlで配列の先頭何要素か以外を抜き出す」でした
概要
今回の概要はタイムスタンプを変更しよう!、Time::Pieceモジュールを使って!です。
思い立ったが吉日、手元のperlで作ってみました。
使うモジュール
- Time::Piece
- コアパッケージになっているオブジェクト指向の時間オブジェクト
- Time::Seconds
- Time::Pieceな時間オブジェクトで計算する際に使用する
コード
TimeStampUpdate.pl#!perl
use strict;
use warnings;
use Time::Piece;
use Time::Seconds;
my $c = @ARGV;
if($c < 2){ # 引数が2つ未満のときは使い方を表示
print ">perl TimeStampUpdate [input file] [update time YYYYmmddHHMMSS]";
} else {
my $file = $ARGV[0]; my @s = stat $file; # stat関数でファイル情報を取得
my $z = Time::Piece->strptime($ARGV[1],"%Y%m%d%H%M%S"); # Time::Pieceを用いて時間オブジェクトに
$z -= (ONE_HOUR * 9); # 指定時間から9時間引いて世界標準時に
utime $s[8], $z->epoch, $file; # utimeを用いて更新時間のみ変更
}
実行結果
Time::Piece
文字列を時間オブジェクトに変換
- Time::Piece->strptime(文字列, フォーマット)関数を使います。
- 例では時間文字列として「20190401221030」を与えましたので、フォーマットは"%Y%m%d%H%M%S"としました。
- 対応は以下のとおりです
- %Y - 2019
- %m - 04
- %d - 01
- %H - 22
- %M - 10
- %S - 30
時間オブジェクトから値を取り出し
- 例ではエポック秒を取り出すのに「->epoch」を使いました
- 他にも「->ymd」でyyyy-mm-dd形式の文字列が得られます
- 詳しくはperldocのTime::Pieceを御覧ください
おわりに
わざわざperlで更新時間を変えようだなんて酔狂ですが、時刻を扱うならTime::Pieceを使いたいねとの思いを込めて投稿しました。
明日は@papixさんです。毎年勉強させてもらっています。今から楽しみです。