あまりWordPressとかじゃ使わないかも知れませんが、スケジュールとかToDoみたいなのを作るときに役に立つかもしれません。
コード
例えば、今日から1年後の7/3までの残り日数を計算する場合はこんな感じにかけます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$expiration_date = '2014/7/3'; $unix_expiration = strtotime($expiration_date); $now = strtotime('now'); $date_interval = round(($unix_expiration - $now) / (60*60*24)); if ($date_interval > 0) { $date_counter = '(残り '.$date_interval.' 日)'; } elseif ($date_interval == 0) { $date_counter = '(今日まで!)'; } elseif ($date_interval < 1) { $date_counter = '( '.-$date_interval.' 日オーバー!)'; } else { $date_counter = '(エラー:日数計算に失敗)'; } echo $expiration_date.$date_counter; |
説明
一応ざっくりと説明しておきます。あとで自分でわからなくなったら困るし←
時間を計算するには
日付を一度すべて秒にしてしまえば簡単にたし算や引き算ができますよね。なので、一度全部秒に変換してから計算して、それからまた時間なり日数なりにもどせばOKそうです。
strtotimeは、所謂日付の書き方(2013/7/3や、2013.7.3など)からUNIX時間と呼ばれる形式 ((1970年1月1日の午前0時0分0秒からトータルで経過した秒数)) に変換されます。
あらかじめ入力された(あるいは保存された)指定の時間と、現在の時間をそれぞれUNIX時間に変換してしまって、その状態で差を求めるわけですね。
で、答えも全部秒で出てきますので、それをまた60x60x24で割ってあげます。 ((60秒が60回で1時間、それが24回で1日になるわけですね))
残り5.214793日とかなるのを何とかする
このままだと秒レベルで計算したものを日数レベルで表現しようとするので、場合によっては小数点以下ものすごい桁数になったりもします。
なので、最後にこれ全体を、round関数で囲ってあげます。round関数は、指定した数値を、指定した桁数までで四捨五入します。指定しなければ小数点以下を四捨五入します。。
因みに四捨五入だけじゃなく、切り上げや切り捨てもできます。
round( 数値 [, 桁数 ] ) | 数値を四捨五入する。
桁数を省略した場合は、小数点以下を四捨五入。 |
floor( 数値 ) | 小数点以下を切り捨てる。 |
ceil( 数値 ) | 小数点以下を切り上げる。 |
期限内かの判定と、表示するときに数値がマイナスになるのを修正する
と、いうことでこれで残り期間が約何日なのかがわかるようになりました。
あとはこの結果がプラスなのかマイナスなのかで、計算結果が、0以上か、0以下か、それとも0なのかを確認すれば、期限内か、当日か、それとも期限切れなのかを判別することができますね。
しかし、計算結果がマイナスのときに、結果をそのまま使うと(表示の際に「-」記号がついてしまうと)、「残り-5日」という書き方なら意味は通じますがなんか回りくどいです。しかしこのままでは「-5日オーバー」という謎の状況が発生してしまいます。
そこで、表示する際は、変数を表示するとき普通「$foo」と書く替わりに「-$foo」という風に書くと、符号を反転させることができますので、結果、「5日オーバー」といった風にかけるようになるわけですね。
(ただし、これは表示するタイミングでやらないと、(少なくとも結果の判定より後にやらないと)マイナスの数値が出なくなりますので、いつになっても期限切れにならなくなってしまいますので注意が必要ですw)
残り24時間以下になったら「残り○日」から「残り○時間」、残り1時間以下からは「残り○分」みたいにどんどん細かくしていくというのも、もう一工夫すればできるかもしれませんね。
それでは。
コメントする