[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ただいまコメントを受けつけておりません。
「閲覧当日の時点で、特定の生徒が年度内に特定のコンテンツを複数回閲覧しているかどうか、閲覧履歴の作成日を見て判定する。"年度内"の判定は、直近の年度開始日以降(閲覧当日よりも前にある日付)の日付を計算して行う」
最近上記のような処理を実装する機会があった。実装当初は、次の2つの処理を一つのメソッドにまとめようとしていた。1つ目の処理については汎用的に使いまわす可能性があり、何よりもメソッド内が複雑になりそうだと感じ、処理を別の関数とメソッドに切り出す事にした。二つ目の処理はさておき、「今日の日付から年度の開始日を算出する処理」の関数の命名ではまった、というか悩んだ。
次に年度の開始日を求めるメソッドをクラスに定義するにあたり、メソッド名をいくつか候補に挙げてみた。
自身の英語力が貧弱という事もあり、しっくりくる名前が思い浮かばない。
少し悩んでから、そもそも「年度内〜」という単語に意識が引きずられている事に気づいた。
期間を算出する処理なので、この処理自身が年度の概念を知っている必要はない。なので、「直近の過去で一番近くに「指定した月」に該当する年月」を取得する、とだけ考えると役割をシンプルに捉えられそうだと思い至った。それでも、ややこしい気がするけれども、「年度」という言葉を排除するだけでも随分印象はさっぱりする。
最終的に、クラスには定義せず、"findMostRecentDate()" という関数を定義した。「最も直近の日付」といった意味になるだろう。おそらく。
本当は「前の」「過去の」といった意味合いも含めるべきかもしれないけれど、適切な表現が思い浮かばなかったので省略し、用例をコメントに含めて関数の挙動を説明することにした。
/** * 指定した日付($date)から過去に遡って、基準月($month_cond)が最初に登場する年月を返す * 例) findMostRecentDate('2014-05-11', 4) -> 2014-04-01 * findMostRecentDate('2014-03-01', 4) -> 2013-04-01 * findMostRecentDate('2017-11-24', 10) -> 2017-10-01 * findMostRecentDate('2015-01-01', 10) -> 2014-10-01 * * @param string $date YYYY-MM-DD形式の日付 * @param int $month_cond 基準月 */ function findMostRecentDate($date, $month_cond) { if (!$date || !$month_cond) return null; $ts = strtotime($date); $year = date('Y', $ts); $c = 3; //適当なところで抜ける while($c>0) { // mktime(hour, min, sec, month,day, year ); $ts = mktime(null, null, null, $month_cond, 1, $year); $recent = date('Y-m-01', $ts); if ($recent < $date) return $recent; $year--; $c--; } return null; }