• ベストアンサー

先月の日数を求める関数にうるう年を適応するかどうか

お世話になります。 今年2月はうるう年ではありませんが下記のPHP関数において、 ■指定した月の日数 <?php echo date('t', strtotime('-1 month')); ?> これは、表示させると先月((month-1)月)の日数「31」を吐き出すのですが、 この関数にはうるう年処理は設定されているのでしょうか? もしPHP5にこの処理がなければ自分でうるう年処理を作成しようとしております。 ご返事お待ちしております。宜しくお願い致します。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

<?php // 今年の2月 var_dump(date('t', strtotime('+0 month'))); // 来年の2月 var_dump(date('t', strtotime('+12 month'))); // 再来年の2月(閏年) var_dump(date('t', strtotime('+24 month'))); を実行してみてください、バッチリ実装されていることが分かるでしょう。また、PHPには指定した日付が有効かどうかチェックするcheckdate関数や、「14年2月1日」といった表記や「2014年1月32日」などの不正な日付を「2014年2月1日」に自動的に修正したりするmktime関数も用意されています。 PHP Manual - checkdate http://www.php.net/manual/ja/function.checkdate.php PHP Manual - mktime http://www.php.net/manual/ja/function.mktime.php こういった関数は標準関数豊富なPHPでなくとも持っている言語は多くあるでしょう。もっともPHPらしさが現れている関数は「日の出・日の入り時刻」を求める関数ですね、こんなものを標準でサポートしている言語はPHPしかありません・・・www PHP Manual - date_sunrise http://www.php.net/manual/ja/function.date-sunrise.php PHP Manual - date_sunset http://www.php.net/manual/ja/function.date-sunset.php よくネタにされます。 ShirasakaBlog - 人狼サイト制作でこだわったところ「PHPの関数で日の出・日の入り前後でデザインが違うサイトにした」 http://shirasaka.tv/3912 >> PHPで、日の出時刻を返してくれる関数があったんです。 >> こんな超マイナーな関数、誰が使うんでしょうね。しょうがないから僕が使います。

-q7P2izb__
質問者

お礼

またまたご回答頂きありがとうございます!! 超有力な回答を頂き大変感激しております。 >// 再来年の2月(閏年) >var_dump(date('t', strtotime('+24 month'))); これには気づきませんでしたね~。さすがです! 確かに、今月は2月ですから最善手ですね(笑) また、checkdate関数なんて便利なのあったのですね! date('X')内に指定するXくらいの知識しかなかったものでw さらに日の出日の入り時刻まであるとは知りませんでした。 それなら春分、秋分の日もあるかもと一瞬思いました。 また、サイト制作でこだわったところ、 ページ見ましたけど、こんな仕様に頭抱えるのかww かなり爆笑しました(笑) でも確かに、日の出日の入り時刻なんてこれがなければ、 計算は複雑怪奇になりそうですね。 どうもありがとうございました。

関連するQ&A

  • strtotimeについて

    指定された月の翌月を返したく以下のようにしました。 // 200909の場合翌月の200910を返す。これは問題ありません echo date('Ym', strtotime('+1 month')); // 問題は以下から // 指定の月をセット $str = '200910; // どちらの場合も200910を返す echo date($str, strtotime('+1 month')); echo date($str, strtotime('-1 month')); このような方法で$strが200911であれば200912を返し200912であれば201001を返したのですが どのようにすれば可能でしょうか?

    • 締切済み
    • PHP
  • Schemeのプログラミング うるう年関連

    Schemeのプログラミング うるう年関連 Schemeで、 「(1)閏年かどうかを判定する関数leap?(number -> boolean)を定義した後、(2)○年○月の日数は何日かを求める関数num-of-days(number number -> number)を定義せよ」 という内容の課題を出されたのですが、(例えば 2009年の7月→31日 2012年の2月→29日) どうもエラーが出て実行できません。 自分は以下のように組みました。 ;;(1)の関数 (define (leap? year) (cond [(= (remainder year 400) 0) #t] [(and (= (remainder year 4) 0)(> (remainder year 100) 0)) #t] [else #f] ) ) ;;(2)の関数 (define (num-of-days year month) (cond [(and (= month 2)(= (leap? year) #t)) 29] [(and (= month 2)(= (leap? year) #f)) 28] [(or (= month 1)(= month 3)(= month 5) (= month 7)(= month 8)(= month 10) (= month 12)) 31] [else 30] ) ) これを例えば (num-of-days 2008 4) や (num-of-days 1995 12) などとして実行すると、それぞれ30,31という正しい値を返してくれるのですが、 (num-of-days 2008 2) や (num-of-days 1995 2) など、閏年・非閏年に関係無く、2月が絡むと =: expects type <number> as 1st argument, given: false; other arguments were: true というエラーを吐いてしまいます。 何度も見直しましたが、どこが間違っているのか見付けきれません…。どなたか間違いを指摘して頂けると幸いです。

  • 変数で来た指定日に対して、+3ヶ月、+6ヶ月、+12ヶ月を計算する方法

    変数で来た指定日に対して、+3ヶ月、+6ヶ月、+12ヶ月を計算する方法が知りたいです。 こんな感じで、当日に対して+する事は知っているのですが echo "1週間後 = " . date("Y/m/d",strtotime("+1 week")); echo "1ヶ月後 = " . date("Y/m/d",strtotime("+1 month")); echo "1年後  = " . date("Y/m/d",strtotime("+1 year")); 当日ではなく、変数できた指定の年月日に対して足す方法が解らなくて困っています。 $data03 = "2010-10-01"; //$data04 = strtotime("+3 month",$data03); $data04 = strtotime($data03,"+3 month"); //$data04 = $data03 + strtotime("+3 month"); echo '3ヶ月後:'.$data04.'<br />'; 結果 3ヶ月後:1285858800 strtotime関数のマニュアルは見ましたが良くわかりません… まったく違う方法でも良いのでお願いします。 いろいろ検索しましたが、当日からの計算方法しか見付かりませんでした。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • php からlaravelで作り直した場合

    a hrefの書き方がわかりません。 index.phpからa hrefでlast.phpに 先月遷移をさせるソースは下記で動きます。 それをindex.blade.phpからlast.blade.phpに遷移させる ことができません。 一応、web.phpとcontrollerを次のように準備しました。 controllerはDBと繋げているので登録してあるデータを取ってきて last.blade.phpに渡すようにしています。 (index.php)動きます <?php $ym = date("Ym"); $lastmonth = date("Ym",strtotime($ym."01"." -1 month ")); $nextmonth = date("Ym",strtotime($ym."01"." +1 month ")); $tm = date("n",strtotime($ym));//月 $ty = date("Y",strtotime($ym));//年 echo '<a href="last.blade.php?ym='.$lastmonth.'"><< 先月</a>'; echo'<head>'.$ty."年".$tm."月".'</head>'; $this_month_days = date("t",strtotime($ym."01"));//当月の日数を取得 ?> (last.php) 最初の部分だけ記載 $ym = (isset($_GET["ym"]))? $_GET["ym"] : date("Ym"); 以下からlaravelで作り直しを試みた記載 (index.blade.php)動かないindex.phpのa hrefの部分のみ下記の通り変更 syntax error, unexpected 'user' (T_STRING), expecting ';' or ','エラーが出る。 echo '<a href="{{route('user.local',['ym'=>'$lastmonth'])}}"><< 先月</a>'; (web.php)last部分だけ抜粋 userフォルダの下にlast.blade.php,index.blade.phpがある Route::get('/last', [KintaiController::class,'last']) ->middleware('auth:users') ->name('last'); (controller)KintaiControlerという名前でcontrollerを作ってある一部抜粋   public function last($lastmonth) { // $e_all = Melon::select('price_a','price_b','price_c','price_d')->paginate(3); $e_all = Kintai::all(); return view('user.last',compact('e_all')); } よろしくお願いします。

    • 締切済み
    • PHP
  • PHPで指定した日付の1ケ月前表示

    MySQLにある日付を拾ってきて表示しています。 <?php echo $row_target_date['ap_date']; ?> 上記のPHPでは、MySQLのテープルのap_dateカラムにある日付を拾ってきて表示するようにしています。 この1ケ月前を表示したいと考えています。 <?php echo "1月前:" . date("Y/m/d",strtotime("-1 month" ,strtotime("echo $row_target_date['ap_date']"))) . "<BR>"; ?> では表示できませんでした。 表示方法についてご指導いただきたくお願い致します。

    • ベストアンサー
    • PHP
  • PHPでの日数の求め方

    PHPで日数を求める処理を作りたいのですが 検索して同じ様な質問をもとに下記のように作成したのですがうまくいきません。 教えてください。 登録処理日(本日)が予約日の10日以上前なら「仮予約」を 登録処理日(本日)が予約日の10日以内なら「本予約」を表示したい 但し、11月1日から11月10日の日数は10日とする考え方で日数を求めたいのです。 登録処理日($tourokuday)が11月21日の場合 予約日($yoyakudate)が11月30日は「本予約」 予約日($yoyakudate)が12月1日は「仮予約」と表示したいのですが $tourokuday=strtotime(date("Y-m-d")); if(strtotime($yoyakudate) - $tourokuday <= 10*24*60*60) { printf("本予約です"); } else { printf("仮予約です"); } 上記で処理を行うと両日とも「本予約」と表示されます プラス1日を加えればいいと思いますがどのようにしたらいいのかわかりません。 質問が解りずらいかもしれませんが宜しくお願いします。

    • 締切済み
    • PHP
  • strtotime 前月・前々月の表示

    お世話になります。 strtotime を使って下記のように前月・前々月の表示をさせています ーーーーーーーーーーーーーーーー <?php for($i = -2 ; $i <= 0 ; $i++){ $year = date("Y",strtotime("$i month")); $month = date("m",strtotime("$i month")); print $year . "年" . $month . "月<br>"; } ?> ーーーーーーーーーーーーーーーー 7月31日にその表示をさせたら 2007年05月 2007年07月 2007年07月 と表示されてしまいました。 今月(8月)に入ってからは こちらの意図するとおりの表示に戻っていました 何か strtotime の使い方等間違っているのでしょうか? ご指導、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 土日をカウントしない日付表示

    PHPで日付の表示方法で困っています。 今日から3日後の日付を表示するときに土日を含まないで表示させたいのです。本日12日ですので17日が表示されるようなPHPをご教授いただきたいです。 <?php echo date("m月d日",strtotime("+3 day"));?> だと単純に3日後ですし、 <?PHP $day = 60 * 60 * 24; $t=mktime(0,0,0,date("m"),date("d")+3,date("y")); if(date("w",$t)==6) $t += $day * 2; if(date("w",$t)==0) $t += $day ; echo date("m月d日",$t); ?> だとしても土日をカウントしているので、思うような結果に至っておりません。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • DATEDIF関数と普通の引き算による日数計算

    7月25日(セルA1)から7月1日(セルB1)までの日数を計算する場合、B1-A1で日数は出てくるようなんですが、例えば月を跨いだ場合、誤差は出てくるのでしょうか?(閏年や、月ごとの総日数の違いなどにより) 日数計算の場合、DATEDIF関数というものもあるようなのですが、これを使うと日数がマイナスになってしまう場合、エラーになってしまうようです。 後者の方が正確であるならば、DATEDIF関数を使いたいんですが、その場合、引き算の結果がプラスになる場合、マイナスになる場合が混在しているデータで使用する場合、どのような計算式を入力すればよいのかが分かりません。 どなたか御存知の方、よろしくお願いします。 ちなみに、単なる引き算で誤差がでないようでしたら、引き算で処理したいと思っています。

  • 日付の比較について

    最近PHPの勉強を始めた初心者です。 はじめて質問させていただきます。 2005-1-1から2020-12-31の間で入力した日付の曜日を表示するプログラムを作成しています。 2005-1-1から2020-12-31の間以外ならエラー表示するようにしたいのですが、 入力した日付との比較がうまくいかず、思うように動きません。 どのように直せばいいのかを教えていただけないでしょうか?よろしくお願いします。 <?php $year=$_POST["year"]; $month=$_POST["month"]; $day=$_POST["day"]; $date_str="$year-$month-$day"; $date_time=strtotime($date_str); $firstdate_str="2005-1-1"; $firstdate_time=strtotime($firstdate_str); $lastdate_str="2020-12-31"; $lastdate_time=strtotime($lastdate_str); if ($date_time < $firstdate_time || $date_time> $lastdate_time)  {  echo "Please enter a date between 1/1/2005 and 12/31/2020.";  } else  {  $finddate=date('l', mktime(0,0,0,$month, $day, $year));  echo "The day entered in on $finddate";  } ?>

    • 締切済み
    • PHP