localtime/timelocal

シェルスクリプトの中で前日日付を求める必要があるが、シェルスクリプトでやるのは大変なので、Perlに丸投げ。

use Time::Local;

$year  = 2008;
$mon   = 3;
$mday  = 1;
$hours = 0;
$min   = 0;
$sec   = 0;
$time  = timelocal( $sec, $min, $hours, $mday, $mon, $year );

$time -= 60 * 60 * 24; # 60秒×60分×24時間

@a = localtime($time);

printf( "%4d%02d%02d\n", $a[5]+1900, $a[4], $a[3]);

あえて3月1日の前日を選んだのは閏年を念頭に入れてのこと。さて……。

20080231

に、2月31日だとォ――!?

「うちゅうの ほうそくが みだれる!」

ここでの注意点は、月は0から始まること(1月は0)と、西暦から1900を引くことです。


何だ、驚かせやがって……*1

use Time::Local;

$year  = 2008;
$mon   = 3;
$mday  = 1;
$hours = 0;
$min   = 0;
$sec   = 0;
$time  = timelocal( $sec, $min, $hours, $mday, $mon-1, $year-1900 );

$time -= 60 * 60 * 24; # 60秒×60分×24時間

@a = localtime($time);

printf( "%4d%02d%02d\n", $a[5]+1900, $a[4]+1, $a[3]);

20080229

足したり引いたりがめんどいのう。

*1:C言語のlocaltimeの仕様だね、これ。仕方ないね。