2009-11-29 1 views
54

Perlスクリプトを書くときに、YYYY-mm-dd HH:MM:SS(たとえば、2009-11-29 14:28:29)という形式の文字列で表される現在の時刻を取得する必要があることがよくあります。これを行うにはPerlでYYYY-mm-dd HH:MM:SSに素早く到達する

私自身は、この非常に面倒なパス取っ見つける:localtimeのを検索するために

  • man perlfunc
  • /localtimeを - manページ
  • の関連セクションに到達するために5回( / + \n)を繰り返し
  • 文字列($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);をマンページから私のスクリプトにコピーします。
  • お試しください
  • 覚えておいてください。#1:現在の年を取得するには、1900〜$ yearを追加する必要があります。
  • お試しくださいmy $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon, $mday, $hour, $min, $sec);
  • 覚えておいてください。#2:現在の月を取得するには1ドルを$ monに追加する必要があります。
  • お試しくださいmy $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
  • 完了!

上記のプロセスは機能しますが、それは最適ではありません。私はよりスマートな方法があると確信していますので、私の質問は簡単です:

Perlで現在の日付/時刻のYYYY-mm-dd HH:MM:SSを取得する最も簡単な方法はありますか?

ここで、「簡単」には、「書きやすい」と「覚えやすい」の両方が含まれます。標準POSIXモジュールで

+0

ますperlfuncを検索し、あなたのための邪魔を覚えているサブルーチンを書いていたはずです! – AmbroseChapel

答えて

64

使用strftime:Perlのバインディングでstrftime

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

引数がlocaltimegmtimeからの戻り値と整合するように設計されました。

+13

ありがとうございます。そして、非一行形式で: POSIXを使用します。 print strftime( "%Y-%m-%d%H:%M:%S \ n"、localtime(time)); – Mike

+0

また、Time :: Piece(コアは5.10以降)にstrftimeがあり、よりオブジェクト指向のフォームを使用できます(下記の私の答えを参照)。また、$^T(プログラム開始からの時間)はあなたが望むものではありません。 – MkV

+3

ウィンドウで5.20.2を使用すると、 '%F'と'%T'の両方がサポートされていないようです。'%Y-%m-%d%H:%M:%S'書式を指定する必要があります – Seki

30

汚れた作業を行うためにDateTimeモジュールを使用しないでください。 を書くのは簡単です!あなたは何が起こっているかわかったら、あなたはタンを取り除くと、数行のコードを保存する得ることができます

use strict; 
use warnings; 
use DateTime; 

my $dt = DateTime->now; # Stores current date and time as datetime object 
my $date = $dt->ymd; # Retrieves date as a string in 'yyyy-mm-dd' format 
my $time = $dt->hms; # Retrieves time as a string in 'hh:mm:ss' format 

my $wanted = "$date $time"; # creates 'yyyy-mm-dd hh:mm:ss' string 
print $wanted; 

strftime方法はありません

use POSIX qw/strftime/; 
print strftime('%Y-%m-%d',localtime); 

use strict; 
use warnings; 
use DateTime; 

my $dt = DateTime->now; 
print join ' ', $dt->ymd, $dt->hms; 
+3

' $ var-> method'は*文字列に*補間されません。 '$ {\ $ var-> method}' 'や' '@ {[$ var-> method]}' 'のようなものです。 – ephemient

+2

@ephemient:Dulyが更新されました。ありがとうございました。 – Zaid

28

はこれを試してみてください効果的に私の仕事。非常に簡単で効率的です。


13

Time::Piece(Perl 5以降のコア)10)また、strftime関数を持っており、過負荷がlocaltimeのデフォルトとのgmtimeで時間::ワンピースオブジェクトを返すために:

use Time::Piece; 
print localtime->strftime('%Y-%m-%d'); 

またはオーバーライドされlocaltimeのなし

+1

+1コアモジュールと使い方について言及すると+1になりました。$$$、$ dt-> ymd、$ dt->膨大な量の利用可能なモジュールがPerlを最初に使用している主な理由の1つであるので、 – osirisgothra

2

Time::Piece::datetime()Tを排除することができます。

use Time::Piece; 
print localtime->datetime(T => q{ }); 
+0

Time :: Pieceのもう一つの言及は私にそれを今思い出させるべきです - 使用されていなければ使用するのを覚えておくのが最も簡単なモジュール日常的に :) – osirisgothra

3

あなただけの人間が読める時間文字列ではなく、その正確な形式たい場合:

$t = localtime; 
print "$t\n"; 

プリント

Mon Apr 27 10:16:19 2015 

または何ロケール用に設定されています。

3

Iは、以下のブロックを1,000,000回ずつ呼び出す少し試験(VMでFreeBSDでのPerl v5.20.1)を作っ:

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); 
my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec); 

B

my $now = strftime('%Y%m%d%H%M%S',localtime); 

Cを

my $now = Time::Piece::localtime->strftime('%Y%m%d%H%M%S'); 

A:2秒

B:11秒

C:19秒

これはもちろんのない完全なテストまたはベンチマークであるが、少なくともそれは、以下の結果を0私にとっては再現可能なので、もっと複雑ではあるが、datetimestampを生成することが非常に頻繁に必要な場合は、最初の方法を好むだろう。それはOSに依存しないではなく、かなりの時間がかかるため

(例えばFreeBSDの10.1下)を呼び出す

my $now = `date "+%Y%m%d%H%M%S" | tr -d "\n"`; 

は、このような良いアイデアではないかもしれません。

敬具、 ホルガー

0

ショートし、必要な甘い、いいえ追加モジュール:例えば

my $toDate = `date +%m/%d/%Y" "%l:%M:%S" "%p`; 

出力は次のようになります。2017年4月25日9時30分33秒AM

関連する問題