Perlではtime関数で1970年1月1日0時0分からの経過秒を取得でき、その値をlocaltime関数を通す事で「年/月/日/曜日/時間/分/秒」に変換する事ができますが、逆に「年/月/日/曜日/時間/分/秒」から秒に戻す事は出来ないので関数を考えてみました。
time()+localtime()で得られた日時を、本スプリクトで変換すれば time()の値と同じになります。
sub ymdhns2time{
my($i,$uru,$output);
my $ye=$_[0]; #年 1970以上
my $mo=$_[1]; #月 1~12
my $da=$_[2]; #日 1~31(月によって異なる)
my $ho=$_[3]; #時 0~23
my $mi=$_[4]; #分 0~59
my $se=$_[5]; #秒 0~59
my $diff=$_[6]; #時差 -86399~86399 時差
#各引数にデータが無い場合は
if($ye eq ""){$ye=1970;}
if($mo eq ""){$mo=1;}
if($da eq ""){$da=1;}
if($ho eq ""){$ho=0;}
if($mi eq ""){$mi=0;}
if($se eq ""){$se=0;}
if($diff eq ""){$diff=0;}
#引数のエラーチェック
if($ye !~ /^[0-9]+$/){return(-1);}
if($ye<1970){return(-1);}
if($mo !~ /^[0-9]+$/){return(-1);}
if($mo<1){return(-1);}
if($mo>12){return(-1);}
if($da !~ /^[0-9]+$/){return(-1);}
if($da<1){return(-1);}
if($ho !~ /^[0-9]+$/){return(-1);}
if($ho<0){return(-1);}
if($ho>23){return(-1);}
if($mi !~ /^[0-9]+$/){return(-1);}
if($mi<0){return(-1);}
if($mi>59){return(-1);}
if($se !~ /^[0-9]+$/){return(-1);}
if($se<0){return(-1);}
if($se>59){return(-1);}
if($diff !~ /^[+-]?[0-9]+$/){return(-1);}
if($diff<-86399){return(-1);}
if($diff>86399){return(-1);}
$uru=0;
if($ye % 4 == 0){
$uru=1;
if($ye % 100 == 0){
if($ye % 400 != 0){$uru=0;}
}
}
if(($mo==1)&&($da>31)){return(-1);}
if($uru==1){ #うるう年
if(($mo==2)&&($da>29)){return(-1);}
}else{
if(($mo==2)&&($da>28)){return(-1);}
}
if(($mo==3)&&($da>31)){return(-1);}
if(($mo==4)&&($da>30)){return(-1);}
if(($mo==5)&&($da>31)){return(-1);}
if(($mo==6)&&($da>30)){return(-1);}
if(($mo==7)&&($da>31)){return(-1);}
if(($mo==8)&&($da>31)){return(-1);}
if(($mo==9)&&($da>30)){return(-1);}
if(($mo==10)&&($da>31)){return(-1);}
if(($mo==11)&&($da>30)){return(-1);}
if(($mo==12)&&($da>31)){return(-1);}
#年の処理(1970からの経過秒+前年までのうるう年の秒数)
$output=($ye-1970)*31536000;
for($i=1970;$i<$ye;$i++){
if($i % 4 == 0){
if(($i % 100 == 0)&&($i % 400 != 0)){
#平年
}else{
$output=$output+86400; #うるう年(1日加算)
}
}
}
#月の処理(1月は年で処理しているので不要)
if ($mo==2){$output=$output+2678400;
}elsif($mo==3){$output=$output+5097600;
}elsif($mo==4){$output=$output+7776000;
}elsif($mo==5){$output=$output+10368000;
}elsif($mo==6){$output=$output+13046400;
}elsif($mo==7){$output=$output+15638400;
}elsif($mo==8){$output=$output+18316800;
}elsif($mo==9){$output=$output+20995200;
}elsif($mo==10){$output=$output+23587200;
}elsif($mo==11){$output=$output+26265600;
}elsif($mo==12){$output=$output+28857600;
}
if($uru==1){ #うるう年の3月以降は1日加算
if($mo>=3){$output=$output+86400;}
}
#日の処理
$output=$output+($da-1)*86400;
#時の処理
$output=$output+$ho*3600;
#分の処理
$output=$output+$mi*60;
#秒の処理
$output=$output+$se;
#時差の処理
$output=$output-$diff;
#時差でマイナスになった時は-1
if($output<0){return(-1)}
return($output);
}
使い方
&ymdhns2time(年,月,日,時,分,秒,時差);
で1970年1月1日0時0分を0秒とした秒数を返します。
・年は1970以降の西暦4桁
・時は0~23時の24時間制
・時差は-86399~86399の範囲で秒で記入、日本の場合はUTC+9時間なので32400と入力
年,月,日,時,分,秒,時差が規定外の時は-1を返します。
例えば、2000年1月1日 13時30分0秒の秒数が知りたければ
$min=&ymdhns2time(2001,1,1,13,30,0,32400);
とすれば$minに秒数が代入されます。
引数を""や省略すると年=1970、月=1、日=1、時=0、分=0、秒=0、時差=0となります。
・&ymdhns2time();なら
=1970/1/1 00:00:00(時差0)と同等→0
・&ymdhns2time("",2,"","","","",32400);なら
=1970/2/1 00:00:00(時差+9時間)と同等→2646000
不要な項目は入れなくても計算できるので、年を指定しない日付だけの計算や、時間だけの計算なども可能です。
ただし年を入れない場合はうるう年に注意が必要です。1970年はうるう年では無いので1年365日で計算されます。
概要
前半は引数のエラーチェックで後半が計算式。
計算式は原始的に1970年からの秒数を加算してます。。
・1分は60秒
・1時間は3,600秒
・1日は86,400秒
・1年は31,536,000秒(うるう年は+86,400秒)
なので
1970年1月1日0時0分を0秒として、1日後なら86,400秒、1年後なら31,536,000秒と言う感じです。