2016-07-18 6 views
1

私は以下の1つのライナーを持っています。これは、今日の1週間前の日付を今日読める形式に変換する必要があります。Perl、読み取り可能な日付にタイムスタンプを変換する

my $week_ago = strftime("%Y-%m-%d", time - 604800);

しかし、私は次のエラーを取得する:

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

誰もが問題はここにあるものをお勧めすることはできますか?私の理解から、strftimeは、タイムスタンプを読み取り可能な日付に変換する必要があります。

答えて

4

あなたのエラーメッセージがを言うように、POSIXのstrftimeはvaulesのリストではなく、UNIXタイムスタンプを取ります。電話する前にlocaltimeまたはgmtimeに電話する必要があります。

my $one_minute_ago = strftime("%Y-%m-%d", localtime(time - 60)); 

上記の例は、1日未満の短い金額で日付計算を行っている場合は問題ありません。それ以上のものはエラーが起こりやすいものです。 1週間前にのシナリオでは、代わりにsobrique's answerを使用してください。

4

Time::Pieceを使用してください。これはlocaltime(およびgmtime)に代わる重要なモジュールですが、はるかに有用な形式になります。

use Time::Piece; 
my $week_ago = localtime() - 604800; 
print $week_ago -> strftime("%Y-%m-%d"); 

注 - 両方localtimegmtimeは今、あなたもそれで、数値の比較を行うことができますを意味し、Time::Pieceオブジェクトを返します。

あなたができるもわかりやすくするために - 輸入Time::Secondsとコメントでボロディンで述べたように(ONE_DAYONE_WEEKなど)より有用定数を定義するために使用します。

use Time::Piece; 
use Time::Seconds qw (ONE_WEEK); 
my $week_ago = localtime() - ONE_WEEK; 
+0

または代わりに、localtimeのののgmtime、あなたが望むものによっては – ysth

+1

また '使用時間::秒「ONE_WEEK''と' localtimeの(時間 - ONE_WEEK) ' – Borodin

+0

は、localtimeの'としてエポック時間に数学を行う(時間 - 604800) ' 'localtime(time - ONE_WEEK)'が間違っています。時には間違った結果が出ることがあります。 Time :: Pieceオブジェクトの算術演算のみが安全です。一定。 – ikegami

関連する問題