なんか気づいたらもう10日しか残ってなくてビックリ仰天なんですよ。まだ全然何も用意してない…ので、何かしてる感を出すためにとりあえずこうやって記事をしたためようと思った次第。
で、PHPで残り日数を割り出すプログラムを書く場合、目標とする日時と現在時刻のUNIXタイムスタンプの差を求め、それを日数に変換する方向で実装するって人が多いんじゃないかと思う。
※後述のDateTimeを使う…って人の方が主流かもしれんが…どうなんだろうね。
UNIXタイムスタンプってのは何かって言うと、簡単に言うとコンピュータで時間を扱うための仕組みで、あらゆる日時を(協定世界時の)「1970/01/01 00:00:00」を基準とした経過秒数で表現したもの。
例えば、「1970/01/01 00:00:01」は基準となる「1970/01/01 00:00:00」から1秒経過した日時だから、これをUNIXタイムスタンプで表現すると「1」になるって訳。これが「1970/01/01 00:01:00」だったらUNIXタイムスタンプは「60」になる。
つまり、二宮飛鳥の誕生日のタイムスタンプから、現在時刻のタイムスタンプを引けば、誕生日までの残り秒数がわかる。更にその秒数を元にごにょごにょ変換することで、残り日数や残り時間を割り出せるって寸法よ。
<?php
// 誕生日当日なら特別なテキストを出力してプログラム終了
if (date('md') === '0203') {
exit('今日は二宮飛鳥の誕生日だよ!!!!盛大に祝いな!!!!');
}
// とりあえず今年の誕生日の日付を求める
$birthday = date('Y-02-03 00:00:00');
// 既に今年の誕生日を迎えてたら、来年の誕生日を「次の誕生日」とする
if (date('Y-m-d H:i:s') >= $birthday) {
$birthday = date('Y-02-03 00:00:00', strtotime('+ 1 year'));
}
// 誕生日のUNIXタイムスタンプを求める
$birthday_time = strtotime($birthday);
// 現在のUNIXタイムスタンプを求める
$now_time = time();
// 誕生日のタイムスタンプから現在のタイムスタンプを引くことで、誕生日までの秒数を取得できる
$remaining_number_of_seconds = $birthday_time - $now_time;
strtotimeは日時を記述した文字列を引数で与えるとそれをタイムスタンプに変換して返してくれる関数で、timeは現在のタイムスタンプを返す関数。
これらの関数で得られたタイムスタンプの差が、誕生日までの残り時間(秒数)になる。
秒数さえわかれば、日、時間、分に変換するのもお茶の子さいさいである。
// 残り時間(秒) / 60で残り時間(分)に変換
$remaining_number_of_minutes = $remaining_number_of_seconds / 60;
// 残り時間(分) / 60で残り時間(時間)に変換
$remaining_number_of_hours = $remaining_number_of_seconds / (60 * 60);
// 残り時間(時間) / 24で残り時間(日数)に変換
$remaining_number_of_days = $remaining_number_of_seconds / (60 * 60 * 24);
echo '残り時間(秒):';
echo $remaining_number_of_seconds;
echo '<br>残り時間(分):';
echo $remaining_number_of_minutes;
echo '<br>残り時間(時間):';
echo $remaining_number_of_hours;
echo '<br>残り時間(日数):';
echo $remaining_number_of_days;
// ○日○時間○分○秒みたいなフォーマットで表示する場合は除数の余りを求める
echo '<br>残り' . sprintf('%s日%s時間%s分%s秒', floor($remaining_number_of_days), $remaining_number_of_hours % 24, $remaining_number_of_minutes % 60, $remaining_number_of_seconds % 60);
これらを実際に表示してみるとこんな感じ。
あと、PHPで時間を扱うならDateTimeクラスを利用するのも良いかな。俺は普段はstrtotimeやdateで済ませちゃうからあんまり使ったことないけど…
今回の記事用にプログラム書いた感じ、「残り○日○時間……」みたいなフォーマットで表示する場合はこっちの方が簡潔に書けて便利~~~~と思いました。
あと、strtotimeとdate使う版とは違い、マイクロ秒単位で差を出すことができるので、厳密な数字出さなきゃならないケースではこっちを使わなきゃいけなさそう。
// DateTimeインスタンスを生成して今年の誕生日をセット
$birthday = new DateTime();
$birthday->setDate($birthday->format('Y'),2,3);
$birthday->setTime(0,0,0);
// 現在の日時を引数にしてDateTimeのインスタンスを生成
$now = new DateTime('now');
// 既に今年の誕生日を迎えてたら、来年の誕生日を「次の誕生日」とする
if ($now >= $birthday) {
$birthday->add(new DateInterval('P1Y'));
}
// 現在の日時と誕生日の差を求める
$interval = $birthday->diff($now);
echo $interval->format('<br>残り%a日%h時間%i分%s秒%fマイクロ秒');
ちなみに、こっちでタイムスタンプの差を出す場合はこう書く。
$remaining_number_of_seconds = $birthday->format('U') - $now->format('U');
これを日数や時間に変換する方法はdateやstrtotime使う版と変わらんので割愛。
あとがき
正直こんな記事書く前に動画とかSSとか作るべきだったと思っているが反省はしていない。
あと、一応今回作ったプログラムもアクセスできるようにしときますね…