トップ > 多言語CGIダウンロード

自作関数の紹介

当サイト自作のCGIで使用している自作のPerl関数(サブルーチン)を公開します。役に立つものがあれば、ご自由に改造してお使いください。

- もくじ -
指定の日付(文字列)から今日までの日数を算出する関数

指定の日付(文字列)から今日までの日数を算出する関数

年を跨いだときの計算が正しくないことが分かりましたので、修正しました。(2006/1/1)
この関数は文字列で構成された日付("YYYY.M.D")をもとにして、その日から今日までの日数を算出できます。
公式は「$days = &days("YYYY.M.D");」となる。

sub days{
  (1)受け渡された日付("YYYY.M.D")を年($regyear)、月($regmonth)、日($regday)に分解する。
  local ($regyear, $regmonth, $regday) = split( /\./, $_[0] );

  (2)日数を代入する変数$daysを初期化する。
  local $days = 0;

  (3)現在時刻(ここでは日本時間=JST-9)を取得する。
  $ENV{'TZ'} = "JST-9";
  ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
  $month = $mon + 1;
  $year += 1900;

  (4)今年が閏年かどうか判定(西暦年が4で割り切れれば閏年、よって2月は29日となる)し、各月の日数を配列@monに代入する。
  if( ($year % 4) = = 0 ){
    @mon = (31,29,31,30,31,30,31,31,30,31,30,31);
  }else{
    @mon = (31,28,31,30,31,30,31,31,30,31,30,31);
  }

  (5)現在の日($mday)から指定の日($regday)を引いた値を変数$dayに代入する。
  $days = $mday - $regday;

  (6)現在の月($month)が指定の月($regmonth)と異なる場合(すなわち同月ではない場合)、指定の月から前月までの日数を変数$daysの値に加算する。
  if($month != $regmonth){
    $m=$regmonth-1;
    while($m!=$mon){
      $days += $mon[$m];
      if($m<12){$m++;}else{$m=0;$regyear++;}
    }
  }

  (7)現在の年($year)が指定の年($regyear)より大きい場合(すなわち同年ではない場合)、指定の年から前年までの日数を変数$daysの値に加算する。
  if($year > $regyear){
    for($y=$regyear; $y<$year; $y++){
      if( ($y % 4) = = 0 ){ $days += 366; } else { $days += 365; }
    }
  }

  (8)求められた日数($days)を返す。
  return $days;
}

©2006 北京紅楼通信