エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


PHPで特定の日間の日付を for、strtotimeで表示する

      2014/04/05

ある特定の日とある特定の日の間の日付を表示する

 

for文の条件に strtotimeを使う

 
ある特定の日とある特定の日の間の日付を取得する処理を作る必要があったのですが、それを for文でアッサリと実現できてしまったので、サンプルソースを載せることにしました。
 
実際に試してもらいやすくするために、サンプルソースに入力フォームと入力チェックも付けました。
 
——————–

<?php
// 祝日
$holiday = array ( '2014-01-01', '2014-01-02', '2014-01-03', '2014-01-13', '2014-02-11', '2014-03-21', '2014-04-29', '2014-05-05', '2014-05-06', '2014-07-21', '2014-09-15', '2014-09-23', '2014-10-13', '2014-11-03', '2014-11-24', '2014-12-23', '2014-12-31' );

if ( isset ( $_GET["mode"] ) ) {
  if ( $_GET["mode"] == "submit" ) {

    // 入力値の取得
    $hiki_no    = $_GET["no"];
    $hiki_from  = $_GET["from"];
    $hiki_to    = $_GET["to"];

    // 変数の初期化
    $err_msg = "";
    $result  = "";

    // 入力チェック
    if ( !$hiki_no ) {
      $err_msg .= "No.が未入力です。<br />";
    } else {
      if ( !preg_match  ( "/^[0-9]{4}$/", $hiki_no ) ) {
        $err_msg .= "No.は半角数値 4桁で入力してください。<br />";
      }
    }

    if ( !$hiki_from ) {
      $err_msg .= "日付(from)が未入力です。<br />";
    } else {
      if ( !preg_match ( '/^([1-9][0-9]{3})\/(0[1-9]{1}|1[0-2]{1})\/(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1})$/', $hiki_from ) ) {
        $err_msg .= "日付(from)は 2014/01/01の形式で入力してください。<br />";
      }
    }

    if ( !$hiki_to ) {
      $err_msg .= "日付(to)が未入力です。<br />";
    } else {
      if ( !preg_match ( '/^([1-9][0-9]{3})\/(0[1-9]{1}|1[0-2]{1})\/(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1})$/', $hiki_to ) ) {
        $err_msg .= "日付(to)は 2014/01/01の形式で入力してください。<br />";
      }
    }

    if ( $err_msg ) {
      $err_msg    = "入力エラー<br />" . $err_msg;
      $err_encode = urlencode ( $err_msg );
      header("Location: ./for_date.php?err_msg=$err_msg");
    }

    // 以下の部分が日付ぐるぐる
    for ( $i = date ( "Y-m-d", strtotime ("$hiki_from") ); $i < date ( "Y-m-d", strtotime ("$hiki_to") ); $i = date ( "Y-m-d", strtotime ("$i +1day") ) ) {

      // 曜日フラグ初期化
      $week_flg = "";
      // w:数値で示す曜日(0:日 ~ 6:土)
      $week_now = date ( "w", strtotime($i) );
      if       ( $week_now == 0 ) {
        $week_flg = "日";
      } elseif ( $week_now == 6 ) {
        $week_flg = "土";
      }

      // 休日フラグ初期化
      $holi_flg = "";
      // 祝日フラグ取得
      if ( in_array ( $i, $holiday ) ) {
        $holi_flg = "祝";
      }

      $result .= "\n--------------\n";
      $result .= $i . $week_flg . $holi_flg;

    }
  }
}
?>

<html><head>
<title>日付ぐるぐる</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head><body>
<h1>日付ぐるぐる</h1>

<?php if ( isset ( $_GET["err_msg"] ) ) {
        echo "<strong>" . $_GET["err_msg"] . "</strong><br />";
      }
?>

<form action="" method="GET">

No.:<input type="text" name="no">数値 4桁で入力<br />
日付(from):<input type="text" name="from">2014/03/31形式で入力<br />
日付(to):<input type="text" name="to">2014/03/31形式で入力<br />

<input type="hidden" name="mode" value="submit">
<input type="submit" name="submit" value="保存">
</form>

<textarea>
<?php if ( isset ( $result ) ) {
        echo $result;
      }
?>
</textarea>

</body></html>

——————–
 
上記のプログラムを実行すると、下記のような感じで日付の一覧が表示されます。
 

--------------
2014-01-01祝
--------------
2014-01-02祝
--------------
2014-01-03祝
--------------
2014-01-04土
--------------
2014-01-05日
--------------
2014-01-06
--------------
2014-01-07
--------------
2014-01-08
--------------
2014-01-09

 
 
ここでは単に日付を表示しているだけですが、実際に利用している処理としては、特定の日と特定の日の間の株価を更新するためのツールとして作りました。
データベースに入っている株価の情報ですが、株式分割などの影響で株価や売買数の調整をする場面が生じます。
そういう場面に使うツールとして、対応する日付と変更された株価の倍率などを指定して、1日 1行の UPDATE文を作成して実行していく、というツールです。
 
その UPDATE文を作る際に特定の日と特定の日の間の日付を取得する必要があったわけです。
土日、祝日の表示は必要なかったものですが、せっかく日付の管理をするならばと後から付けました。
 
実際に作ってみると意外に簡単だったんですが、for文の条件の中にも strtotimeが使えたことが新鮮な驚きがありました。
 
 

for文サンプルソースの解説

 
具体的には上記のソースです。
 
面白かったのは、49行目の for文のところです。
 
for文は、特定の開始の数値から、決められた数値を増やしていきながら、決められた条件になるまで処理を繰り返す、というものです。
 
そのため、増やしていく数値は「1」ずつ増やしていく必要はないわけですが、下記のように 1ずつ足していくものをよく記述します。
——————–

for ( $i = 0; $i < 100; $i++ ) {
  :
  :
}

——————–
 
だけど、今回は「1」ずつであっても「1日」ずつ増やしていくわけで、それはどうすればいいんだろう?とふと思ったことがきっかけです。
 
ただ、出来上がった for文の条件は、strtotimeで日付を UNIXタイムスタンプの数値に変換しているだけですので、
 
例えば、2014年01月01日~2014年01月20日の場合は、
 
strtotime(“2014-01-01”); となり、実際の値は「1388502000」になり、for文の中身は
 
——————–

for ( $i = 1388502000; $i < 1390143600; $i + 86400 ) {

——————–
 
となっているだけなんですよね。
 
具体的に数値を当てはめてみると何の問題もないことが分かるわけですが、自分で記述しておきながら、ほほーと思った次第です。
 
もし、日付を for文でぐるぐる回しながら何かしらの処理を作る方の参考になれば幸いです。

 - PHP・Smarty・ECCUBE

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

Smartyの Syntax Errorの原因はスペースかも

Smartyのなかなか原因がつかめない Syntax Errorの原因はスペースかもしれません。

PHPで1ヵ月前、先月、今月1日、来月末の日付などの算出はDateTimeImmutableを使う
PHPで1ヵ月前、先月、今月1日、来月末の日付などの算出はDateTimeImmutableを使う

PHPには日時をオブジェクトとして生成する関数「DateTimeImmutable」「DateTime」が用意されている。これを利用して1ヶ月後、月初日、月末日、5日後などを指定して日付を取得できる。

cURLを利用する際の注意点「&」があるURLは「"」で囲む
cURLを利用する際の注意点「&」があるURLは「」で囲む

cURLでURLはダブルクォーテーションで囲む。LinuxでもWindowsでもコマンドでは「&」は意味を持つ文字のためエラー原因になる。クォーテーションは常につけておく方が無難。

配列の値をテキスト表示する際に「、」でつなげるときの処理方法の一例
配列の値をテキスト表示する際に「、」でつなげるときの処理方法の一例

配列の値を「、」でつないで出力する際、単純にforeachで繰り返し処理をすると「イヌ、サル、キジ、」となるが文字列最後の「、」を出力しない方法を3つ解説している。

リダイレクトループが原因で「ERR_TOO_MANY_REDIRECTS」「このページを表示できません」が出たときの対策12事例+α

リダイレクトループ、自動転送設定ループの原因の解説とその対応方法を含め事例 12例を挙げて説明。

QRコード作成ライブラリ「cakePHP-QR-Code-Helper」をPHPで使うカスタマイズ
QRコード作成ライブラリ「cakePHP-QR-Code-Helper」をPHPで使うカスタマイズ

CakePHP2用のQRコード作成ライブラリ「cakePHP-QR-Code-Helper」をプレーンのPHPでも使うためのカスタマイズ方法を解説。1ファイルを設置するだけでQRコードが作れるため使い勝手がいい。

PHP画面が真っ白 header(“Location: $url”);

PHPの開発で header(“Location: $url”);を使うと画面が真っ白になる不具合が出る場合もあります。

ECCUBEの注文完了画面注文番号と商品情報を編集するCRITEO(クリテオ)タグを編集

ECCUBEの注文完了画面にクリテオのタグを編集する方法を紹介。標準機能では完了画面に注文IDや購入商品の情報を渡さないため改修が必要です。

ECCUBEでカード決済NGの受注情報をマイページ購入履歴に表示しない方法解説

ECCUBEでカード決済に失敗しても購入履歴一覧に注文情報(受注情報)が表示される問題への対処方法を解説。受注情報レコードの作成の流れとステイタスについても解説。

PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較

PHPからWebサイトにアクセスしてHTMLを取得、APIにアクセスして情報を取得する場合は、cURLがオススメ。file_get_contentsでも可能だがエラー制御に難がありトラブルのもとになる。