3455357
ツッコミ掲示板
HOME

レスを書き込みます



←01月 2006年02月 03月→
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 1 2 3 4
スペースでAND検索

分類
いろいろ(410)
特に無い(832)
仕事(471)
日常(303)
CGI(37)
PC系(89)
ネッ友関係(28)
WEB系(39)
らーめん(209)
おでかけ(95)
ゲーム(54)
友達(108)
おもしろ(19)
実家(144)
雑談(41)
スペイン語(60)
ペルー旅行記(21)
旅行記(41)
家(85)
生活(60)
台湾旅行記(7)
ねこ(3)

最新レス
掃除機壊れた
(キタ)11/26 17:14
kindleキター
(moon)05/25 00:13
お釜
(moon)04/05 19:56
襲撃
(moon)01/03 09:53
襲撃
(NOB)01/03 09:27
のうしゃ!
(よしお)04/05 22:29
壊れた!!!
(moon)12/10 22:59
壊れた!!!
(いた)12/10 06:04
いろいろ購入
(イタ)10/21 07:30
ダウン
(イタ)09/23 09:19

最新トラックバック
カタンをやったぞ(日記) 07/20 08:09
蟻の行列
カタンをやったぞ(日記) 07/20 08:09
大和へ
やらかしちまった。(日記) 06/25 10:18

2006年2月2日(木)
分類:未設定 [この記事のURL]
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;
}

NAME:
書込PASS:
(書込PASSは「bpo8」です)

nik6.63