1. ホーム
  2. perl

PerlでYYYY-mm-dd HH:MM:SSを高速に取得する

2023-09-16 12:40:55

質問

Perl スクリプトを書くとき、次のような形式の文字列で表される現在時刻を取得する必要性にしばしば気づきます。 YYYY-mm-dd HH:MM:SS (例えば 2009-11-29 14:28:29 ).

こうすることで、私は自分自身がこのかなり面倒な道を歩んでいることに気づきます。

  • man perlfunc
  • /localtime でlocaltimeを検索する - 5回繰り返す ( / + \n ) で、manpage の関連セクションに移動します。
  • 文字列をコピーする ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); を私のスクリプトにコピーしてください。
  • で試してみてください。 my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year, $mon, $mday, $hour, $min, $sec);
  • 注意点その1:現在の年を得るためには、$yearに1900を加えなければならない。
  • で試してみてください。 my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon, $mday, $hour, $min, $sec);
  • 注意点その2:当月を得るには$monに1を足す必要があります。
  • で試してみてください。 my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
  • 大丈夫そうですね。Done!

上記のプロセスは機能しますが、最適とは程遠いものです。もっとスマートな方法があると思うので、私の質問は単純です。

を取得する最も簡単な方法は何ですか? YYYY-mm-dd HH:MM:SS を得る最も簡単な方法は何ですか?

ここで "easy" は "easy-to-write" と "easy-to-remember" の両方を包含しています。

どのように解くのですか?

使用方法 strftime を標準の POSIX モジュールで使用されます。の引数は strftime の戻り値と一致するように設計されています。 localtime gmtime . 比較する

strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)

my          ($sec,$min,$hour,$mday,$mon,$year,$wday,     $yday,     $isdst) = gmtime(time);

コマンドラインでの使用例は

$ perl -MPOSIX -le 'print strftime "%F %T", localtime $^T'

のようにソースファイルから、あるいは

use POSIX;

print strftime "%F %T", localtime time;

システムによっては %F%T という短縮形があるため、明示的に

print strftime "%Y-%m-%d %H:%M:%S", localtime time;

または

print strftime "%Y-%m-%d %H:%M:%S", gmtime time;

なお time は現在時刻を返すのに対し $^T はプログラムが開始された時刻に固定される。とは gmtime で、返り値は GMT での現在時刻となる。ローカルタイムゾーンの時刻を取得するには localtime .