LoginSignup
0
0

More than 1 year has passed since last update.

perlでタイムスタンプを変更したい、Time::Pieceを使って

Last updated at Posted at 2022-12-05

この記事は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を用いて更新時間のみ変更
}

実行結果

sample.txtは2022/12/4 10:45です
01.png

これを2019/4/1 22時10分30秒に書き換えます
02.png

sample.txtの更新日時が書き換わりました
03.png

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さんです。毎年勉強させてもらっています。今から楽しみです。
 

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0