|
|
|
Perlではtimelocalの関数が標準でついていないわけですよ。
(日時からUnixTimeへの変換)
localtimeならば標準なんですが。。。
(UnixTimeから日時への変換)
で、これを解消するために、ネットから検索して拾ってきたルーチンを使ってたわけですよ。
でも、これだとなぜか2006年の2月を指定すると正しい時間を取ってくれない・・・
# 簡易timelocal関数(日付=>秒数変換)
sub timelocal {
my($Sec, $Min, $Hour, $Date, $Mon, $Year) = @_;
my($sec, $min, $hour, $date, $mon, $year, $day, $yday, $isdst);
my($cnt) = 0;
my($Now) = time;
while($cnt < 20) {
($sec, $min, $hour, $date, $mon, $year, $day, $yday, $isdst) = localtime($Now);
if ($year != $Year) {
$Now -= ($year - $Year) * 31536000;
} elsif ($mon != $Mon) {
$Now -= ($mon - $Mon) * 2592000;
} elsif ($date != $Date) {
$Now -= ($date - $Date) * 86400;
} elsif ($hour != $Hour) {
$Now -= ($hour - $Hour) * 3600;
} elsif ($min != $Min) {
$Now -= ($min - $Min) * 60;
} elsif ($sec != $Sec) {
$Now -= ($sec - $Sec);
} else {
last;
}
$cnt++;
}
$Now = 0 if $cnt == 20;
return $Now;
}
そんなわけなので、仕方なく自分で作りました。
処理がかなり冗長ですが、まぁ、そんなに気にしなくてはいけないとこには使ってないのでいいのですが。
とりあえずメモ的な日記と言うことで。
sub timelocal2 {
my($Sec, $Min, $Hour, $Date, $Mon, $Year) = @_;
my($sec, $min, $hour, $date, $mon, $year, $day, $yday, $isdst);
my($Now) = time;
$cnt = 0;
my($cnt2) = 0;
while(1) {
($sec, $min, $hour, $date, $mon, $year, $day, $yday, $isdst) = localtime($Now);
$year+=1900;
if ($Year == $year) {
last;
} elsif($Year > $year) {
$Now += 60*60*24*350;
} else {
$Now -= 60*60*24*350;
}
$cnt++;
if ($cnt > 20) { $cnt2++; last; }
}
if (!$cnt2) {
# 月
my($cnt) = 0;
while(1) {
($sec, $min, $hour, $date, $mon, $year, $day, $yday, $isdst) = localtime($Now);
$mon++;
if ($Mon == $mon) {
last;
} elsif($Mon > $mon) {
$Now += 60*60*24*28;
} else {
$Now -= 60*60*24*28;
}
$cnt++;
if ($cnt > 15) { $cnt2++; last; }
}
}
if (!$cnt2) {
# DAY
my($cnt) = 0;
while(1) {
($sec, $min, $hour, $date, $mon, $year, $day, $yday, $isdst) = localtime($Now);
if ($Date == $date) {
last;
} elsif($Date > $date) {
$Now += 60*60*24*1;
} else {
$Now -= 60*60*24*1;
}
$cnt++;
if ($cnt > 31) { $cnt2++; last; }
}
}
if (!$cnt2) {
# Horu
my($cnt) = 0;
while(1) {
($sec, $min, $hour, $date, $mon, $year, $day, $yday, $isdst) = localtime($Now);
if ($Hour == $hour) {
last;
} elsif($Hour > $hour) {
$Now += 60*60*1;
} else {
$Now -= 60*60*1;
}
$cnt++;
if ($cnt > 24) { $cnt2++; last; }
}
}
if (!$cnt2) {
# Min
my($cnt) = 0;
while(1) {
($sec, $min, $hour, $date, $mon, $year, $day, $yday, $isdst) = localtime($Now);
if ($Min == $min) {
last;
} elsif($Min > $min) {
$Now += 60*1;
} else {
$Now -= 60*1;
}
$cnt++;
if ($cnt > 60) { $cnt2++; last; }
}
}
if (!$cnt2) {
# Sec
my($cnt) = 0;
while(1) {
($sec, $min, $hour, $date, $mon, $year, $day, $yday, $isdst) = localtime($Now);
if ($Sec == $sec) {
last;
} elsif($Sec > $sec) {
$Now += 1;
} else {
$Now -= 1;
}
$cnt++;
if ($cnt > 60) { $cnt2++; last; }
}
}
$Now = 0 if $cnt2;
return $Now;
}
|
|
|