PHPでの日付取得関数もろもろ

※以前別の場所で書いた文章を備忘的に書き記しておきます。

【投稿年月日】2008-05-28 【ジャンル】PHP/MySQL

 PHPでは、date()やstrtotime()など、日付を取得・加工する関数が多く用意されています。
  1. date() : ローカルの日付/時刻を書式化する。
  2. strtotime() : 英文形式の日付を Unix タイムスタンプに変換する。
  3. mktime() : 日付を Unix のタイムスタンプとして取得する。
  4. checkdate() : グレグリオ歴の日付/時刻の妥当性を確認します。
 けれども、PHPで用意されている関数だけでは、税金の申告期限(法定納期限)など、意図した日付を出力できない場合があります。(このことは「加算税・延滞税の計算式」を作成中に気が付いた)
 法人税の申告期限は決算年月日の2ヶ月後なので、例えば、決算年月日が2008年3月31日の場合には、原則的に2008年5月31日となります。これだけならば、
$ymd = "2008-03-31";
$ymd_limit = date('Y-m-d', strtotime("+2 month", strtotime($ymd)));
などと記述すればOKです。

 ところが、申告期限が土日祝日の場合、休日明けの日にずれ込むというルールがあります。すなわち、決算年月日が2008年3月31日の場合、申告期限は、2008年5月31日が土曜日なので、休日明けの2008年6月2日となります。
 また、決算年月日が2月28日や12月31日の場合なども、上記コードでは期待通りの結果を得ることができません。
 
 どうやらPHPの仕様ということなので、ユーザー関数で対応するしかありません。公開されているものはないかと調べてみましたが見当たらなかったので、ユーザー関数を作成しました。
 と言うことで、それなりに需要がありそうなのでソースを公開します。適宜修正した上でご利用ください。

◆1.数ヶ月前・数ヶ月後の日付を取得する関数: NextPrevMonth()


<?php
 $ymd = '2007-12-31';
 $ymd2n = NextPrevMonth($ymd, 2); //2ヶ月後
 $ymd1p = NextPrevMonth($ymd, -1); //1ヶ月前
 echo $ymd.' => '.$ymd2n.' :: '.$ymd1p;

 function NextPrevMonth($ymd='', $num=0) {
  $a = explode('-', $ymd);
  $tdate = date('t', strtotime($a[0].'-'.$a[1].'-1'));
  if($a[2]==$tdate || !checkdate($a[1]+$num, $a[2], $a[0])) {
   $jd = date('t', mktime(0, 0, 0, $a[1]+$num+1, 0, $a[0]));
  }else {
   $jd = $a[2];
  }
  return date('Y-m-d', mktime(0, 0, 0, $a[1]+$num, $jd, $a[0]));
 }
?>

◆2.土日の場合は休み明けに変更する関数: ChangeSS()


<?php
 $ymd = '2008-05-24';
 $ymd_ch = ChangeSS($ymd);
 echo $ymd.' => '.$ymd_ch;

 function ChangeSS($ymd='') {
  $ndate = date('N', strtotime($ymd." 00:00:00"));
  switch(TRUE) {
  case ($ndate==6) :
   return date('Y-m-d', strtotime("+2 day", strtotime($ymd." 00:00:00")));
  case ($ndate==7) :
   return date('Y-m-d', strtotime("+1 day", strtotime($ymd." 00:00:00")));
  default:
   return $ymd;
  }
 }
?>

◆3.末日が存在しない場合(*2/29など)に調整する関数:ExistLastDay()


<?php
 $ymd = '2007-02-29';
 $ymd_ch = ExistLastDay($ymd);
 echo $ymd.' => '.$ymd_ch;

 function ExistLastDay($ymd='') {
  $a = explode('-', $ymd);
  if(!checkdate($a[1], $a[2], $a[0])) {
   $tdate = date('t', strtotime($a[0].'-'.$a[1].'-1'));
   $ymd = $a[0].'-'.$a[1].'-'.$tdate;
  }
  return $ymd;
 }
?>

 法人税の申告期限を求める場合などは、1.と2.を組み合わせることで実現できるかと思われます。3.はおまけです。

 なお、祝祭日については、プログラムを組むのが面倒なわりに得るものが少ないので、対応していません。

EDIUNET | PHP/MySQL | 独り言 | 提供サービス | JavaScript