Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
PHP
入門編
- トップページ
- PHP入門編 - とあるおっさんとUNIX timeとtime()とdate()
とあるおっさんとUNIX timeとtime()とdate()
みなさまどうも。いかがお過ごしでしょうか。
これまでif文とか比較演算子とかswitch文とか色々と解説をしてきましたので、今回はそれを利用して『アクセスしてきた時刻を表示するプログラム』(とあるおっさんの一日)をいっぱつ書いてみましょう。
まずPHPで現在時刻を取得する『time()』という関数と日時に変換してくれる『date()』を紹介します。『time()』は『UNIX time』(ユニックスタイム)で取得しますので、その取得した値を『date()』を使って変換する、といった流れになります。
『UNIX time』(UNIX時間)とはコンピューター上で使用される『1970年1月1日0時0分0秒』からの経過時間のことです。
これはほぼ全てのOSやプログラム言語で実装されている概念になり、時間系の処理をさせるなら『UNIX time』が良く使用されます。
ただし、言語によって『秒』で取得するのか『ミリ秒』で取得するのかなど若干の違いがありますのでご注意下さい。
ちなみにPHPの『time()』では『秒』での取得となります。
というわけで以下に『time()』を使ったサンプルを用意しました。一旦変数に突っ込みます。
<?php $time = time(); var_dump($time);
これを実行させるとこうなります。
int(1442029244)
この記事は2015/9/12のお昼ごろに執筆しているわけなんですが、その時刻の『UNIX time』の『1442029244』が出力されていますね。『time()』を使用するとこんな感じで演算結果を返してくれます。『int』となっているところにも注目しておきましょう。ちゃんと数値型なのでそのまま数値として演算させることができます。
さて、コンピューターで処理させるならば『UNIX time』でOKなんですが、人間が読むとするとかなりわけわかめでございますね。そこで『date()』を使って馴染みある日時の表記方法に変換しましょう。以下のような感じです。
<?php $time = time(); echo date('Y年m月d日 H時i分s秒', $time);
これを実行させるとこうなります。
2015年09月12日 13時15分06秒
はい、馴染みある表記方法に変更されてますね。
もし『date()』で出力した時間がずれている場合はPHPでのタイムゾーンの設定が日本時間になっていない可能性があります。
その場合は『php.ini』をテキストエディタとかで開き、『date.timezone』というところを 『"Asia/Tokyo"』にしてあげてください。これで日本時間に変更することができます。
※『php.ini』についてはこちらの記事を参照。
date.timezone = "Asia/Tokyo"
『php.ini』を編集し、それを反映したい場合はMAMPとかのウェブサーバーソフトウェアの再起動が必要ですのでそちらも忘れないように気をつけて下さい。
では『date()』の記述方法を確認していきましょう。第1引数に出力させたい文言を指定するわけでございますが、『Y』とか『m』とか『d』とかの妙なアルファベットが書いてありますよね。以下の部分です。
echo date('Y年m月d日 H時i分s秒', $time);
『date()』の第1引数に、用意されているアルファベット(フォーマット文字列)を書くと、その部分が該当する時間などに変換して出力してくれます。フォーマット文字列以外の文字列があった場合はそのまま文字列として出力してくれます。
例えばアルファベットの『Y』は4桁の西暦にしてくれるフォーマット文字列なわけなので第1引数に『Y』とだけ書くと『Y』の部分が西暦に変換されて出力されます。
<?php $time = time(); echo date('Y', $time); // 『2015』とかが出力されます。
第1引数に『Y年』と記述すると『Y』は西暦に変換されますが『年』という文字列はフォーマット文字列ではないため、そのまま出力されて『2015年』とかになります。
<?php $time = time(); echo date('Y年', $time); // 『2015年』とかが出力されます。
フォーマット文字列を変換させないでそのまま出力させたい場合は『\』を使ってエスケープさせればOKです。
<?php $time = time(); echo date('\Y', $time); // 『Y』と出力されます。
『m』が『月』、『d』が『日』、『H』が『時』(24時間表記)、『i』が『分』、『s』が『秒』なので『Y年m月d日 H時i分s秒』とすると『2015年09月12日 13時15分06秒』とかになる感じですね。
『date()』は他にも様々なフォーマット文字列が用意されているので以下とか確認してみてください。PHPの公式リファレンスさんのサイトです。
http://php.net/manual/ja/function.date.php
ちなみに今現在の時間を『date()』で出力させたい場合は第2引数を省略しちゃえばOKです。
<?php echo date('Y年m月d日 H時i分s秒'); // このように第2引数を省略すれば現在時刻での日時とかを出力してくれます。
こちらの形も覚えておきましょう。
さて、現在時刻の出力の方法はこんな感じになりますが、これだけだと面白くないので時刻に合わせて出力する文字列を変えるウェブサイト、『とあるおっさんの一日』を作ってみましょう。というわけでさらのHTML5のソースコードを用意します。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>とあるおっさんの一日</title> </head> <body> <!-- ここにPHP書くよー --> </body> </html>
まずp要素の開始タグと終了タグをPHPで出力してあげます。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>とあるおっさんの一日</title> </head> <body> <?php echo '<p>'; echo '</p>'; ?> </body> </html>
続いて午前なら赤字、午後なら青字にしてみましょう。文字の色を赤字にするには『<p style="color: red">』、青字にするには『<p style="color: blue">』とかを出力させてあげれば良いので、if文と『time()』と『date()』を使って以下のように構築します。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>とあるおっさんの一日</title> </head> <body> <?php $time = time(); // アクセス時間の『UNIX time』を変数に代入します。 if(intval(date('H', $time)) < 12) echo '<p style="color: red">'; // 午前か午後かでp要素の開始タグを出し分けします。 else echo '<p style="color: blue">'; echo '</p>'; // アクセス時間用のp要素の閉じタグを出力します。 ?> </body> </html>
ちょいと『time()』で取得した『UNIX time』を変数に代入しているところに注目してみましょう。なぜこんなことをしているのかというと、『time()』で取得する値は刻一刻と値が変わっていってしまうため、一度変数とかに代入させて固定値にしておく必要があるのです。あと処理の軽減という意味もありますね。
そしてif文の『()』の中に注目してみましょう。『intval(date('H', $time)) < 12』となっていますね。まず午前中かどうかを判定するには『date('H', $time)』で取得した時間が『12』時より前かどうかを判定すればいいので『date('H', $time) < 12』とすればいいのですが、なにやら『intval()』ってやつで囲まれていますね。
この『intval()』は文字列を数値に変換してくれる関数になります。例えば『intval('1')』としてあげると文字列『1』を数値『1』に変換してくれる、という感じですね。『date()』で生成した日時は文字列で数値に変換する必要がありますので『intval(date('H', $time)) < 12』としています。ちなみにフォーマット文字列『H』の場合は『00』~『23』までの値が文字列で返ってきます。
(´-`).。oO(ちなみにPHPでは文字列の数値と純粋な数値の比較処理は純粋な数値での比較になるので『intval()』は必要なかったりしますが...)
(´-`).。oO(厳密な処理が行われるよう構築していったほうがPHP本体のアップデート時とかのトラブル発生率が下がって安心なので...)
(´-`).。oO(上記のように念のためちゃんと型を揃えてから比較させる、というパターンで構築していくことをオススメします...)
『intval()』は第1引数の中の文字列の数値を数値型にしてくれる関数ですが、以下のように文字と数値が入り混じった形でも実行可能で、最初の数値部分のみ取り出してそれを数値に変換してくれるという処理をしてくれます。
<?php echo intval('12hoge3'); // 数値『12』が出力されます。
しかし、かなり分かりづらいので上記のような処理をさせることはまれです。
そして第1引数の頭に『x0』、または『0X』と書いたり、第2引数に数値『16』を記述すると16進数にしてくれます。第2引数に数値を指定する場合の第1引数は文字列である必要があり、上手く変換できなかった場合は『0』を返します。『x0』、または『0X』と指定する場合は文字列型ではなく数値(整数リテラル)となりますのでご注意ください。
<?php echo intval('hoge'); // 上手く変換できない値の場合は『0』となります。 echo intval(0xFF); // 『255』と出力されます。 echo intval(0XFF); // 『255』と出力されます。 echo intval('0XFF'); // 『0X』と頭に記述して16進数を返させたい場合は文字列で渡すとダメです。これは上手く変換できずに『0』となります。 echo intval('FF', 16); // 『255』と出力されます。 echo intval([]); // 空の配列を渡した場合は『0』となります。 echo intval([1, 2]); // 何か値の入っている配列の場合は『1』となります。
その他では8進数なども生成できますが、PHPの言語の特性上、10進数以外はあまり使用されませんので特に覚えなくても大丈夫だと思います。
10進数とは10になったら繰り上がる数の数え方という意味です。つまりみなさんが普段使っている数字だと思って頂いて問題ありません。
2進数は0,1を用いて2で繰り上がる数の数え方で、16進数とは0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, Fを用いて16で繰り上がる数の数え方です。
よくRPGゲームなどでキャラクターの最大パラメーターが『255』と設定されているのを見たことがあると思います。これはパラメーターの最大値が16進数で2桁と設定されているという理由からだったりします。16進数での2桁の最大数値『FF』を10進数で変換すると『255』になるということですね。
10進数を2進数に変換する計算方法は10進数を2で割り、その商をさらに2で割り、さらにその商を2で割り...と商が0になるまで計算し、その余りを最後から逆順に並べることで求められたりしますが、面倒くさいのでコンピューターに計算させちゃったり、電卓を使ったほうが楽です。16進数も然りです。
昨今ではPCスペックの向上などの理由から2進数と16進数はそこまで使用されなくなりましたね。
これで午前と午後で文字色が変わるようになりました。そしたらアクセスしてきた時間を出力させてみましょう。
これは『date()』を使って時間表記のフォーマットを揃えてあげればOKです。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>とあるおっさんの一日</title> </head> <body> <?php $time = time(); // アクセス時間の『UNIX time』を変数に代入します。 if(intval(date('H', $time)) < 12) echo '<p style="color: red">'; // 午前か午後かでp要素の開始タグを出し分けします。 else echo '<p style="color: blue">'; echo 'アクセス時間: ' . date('H時i分s秒', $time); // アクセス時間を出力します。 echo '</p>'; // アクセス時間用のp要素の閉じタグを出力します。 ?> </body> </html>
そしたら各時間ごとに熱いメッセージを出力するようにしてあげましょう。ここは練習がてらswitch文(厳密な比較をさせるパターン)を使って構築します。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>とあるおっさんの一日</title> </head> <body> <?php $time = time(); // アクセス時間の『UNIX time』を変数に代入します。 if(intval(date('H', $time)) < 12) echo '<p style="color: red">'; // 午前か午後かでp要素の開始タグを出し分けします。 else echo '<p style="color: blue">'; echo 'アクセス時間: ' . date('H時i分s秒', $time); // アクセス時間を出力します。 echo '</p>'; // アクセス時間用のp要素の閉じタグを出力します。 echo '<p>'; // メッセージ用のp要素の開始タグを出力します。 switch(true){ // 各時間によってメッセージを出し分けします。 case intval(date('H', $time)) <= 7: echo '...。'; break; case intval(date('H', $time)) <= 8: echo '起きた。多少二日酔いだが動けなくはない。しかししょっぱなから飛ばすと後でバテる。とりあえずコーヒーを飲んで目を覚ますことに専念すべき。9時から本気出す。'; break; case intval(date('H', $time)) <= 10: echo '...。'; break; case intval(date('H', $time)) <= 11: echo 'しまった。ニコ動を見ていたら数時間たっていた。しかしまだ慌てる時間じゃない。12時から本気出す。'; break; case intval(date('H', $time)) <= 12: echo '世間はランチの時間だ。お腹も空いてきた。区切りの良い12時という時刻を逃すのは惜しいが、社会の流れと自分の時間を合わせることは非常に重要だ。まだ一日は長い。ここはランチを済ませることにしよう。13時から本気出す。'; break; case intval(date('H', $time)) <= 14: echo '...。'; break; case intval(date('H', $time)) <= 15: echo 'しまった。たらふく食べたらなんだか眠くなってしまい、ついうたた寝をしてしまった。しかし寝起きですぐ動くと体に悪い。まだ一日は長い。16時から本気出す。'; break; case intval(date('H', $time)) <= 16: echo '昼寝しすぎた影響か体がだるい。無理しても効果がないのでここは雌伏の時。まだ夜は始まったばかり。17時から本気出す。'; break; case intval(date('H', $time)) <= 20: echo '...。'; break; case intval(date('H', $time)) <= 21: echo 'しまった。ゲームをやっていたらこんな時間になっていた。この時間から頑張るのも良いが世間はディナーの時間だ。社会の流れと自分の時間を合わせることは非常に重要だ。ここはディナーを済ませることにしよう。22時から本気出す。'; break; case intval(date('H', $time)) <= 23: echo 'しまった。ビールを飲んでいたらこんな時間になってしまった。非常に残念だが今日はチャンスがなかった。悔しいので2chに「充実した一日だった」と書き込んでおこう。明日から本気出す。'; break; } echo '</p>'; ?> </body> </html>
(´-`).。oO(上記のサンプルでは練習のためswitch文を使っていますが...)
(´-`).。oO(前の記事で解説したとおり、PHPでの厳密な比較での分岐処理をさせたい場合はif文を使うのが多数派ですのであしからず...)
さて、これでアクセスしてきた時間によって文章が変わるようになりました。
とりあえず動作チェックが終わって問題なければこのプログラムはとりあえずOKなのですが、このプログラムはちょっと問題があります。
それは『intval(date('H', $time))』というところです。
『intval(date('H', $time))』で返される値を何回も使用しているにも関わらず、『intval(date('H', $time))』とそのまま記述されてしまっていますね。ということは『intval()』と『date()』の処理が無駄に走ってしまっているので効率の良い処理とは言えない感じになっちゃってます。
このような同じ値を何度も使用するとき、どのようにすればスマートなのでしょうか。そうです、変数に代入してしまえばいいんでしたね。というわけで適当に名前をつけた変数に『intval(date('H', $time))』の値を入れてしまってその変数の値を使って処理を走らせるようにしてしまいましょう。以下が完成形です。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>とあるおっさんの一日</title> </head> <body> <?php $time = time(); // アクセス時間の『UNIX time』を変数に代入します。 $int_h = intval(date('H', $time)); // 何度も使う値は変数にいれてあげましょう。 if($int_h < 12) echo '<p style="color: red">'; // 午前か午後かでp要素の開始タグを出し分けします。 else echo '<p style="color: blue">'; echo 'アクセス時間: ' . date('H時i分s秒', $time); // アクセス時間を出力します。 echo '</p>'; // アクセス時間用のp要素の閉じタグを出力します。 echo '<p>'; // メッセージ用のp要素の開始タグを出力します。 switch(true){ // 各時間によってメッセージを出し分けします。 case $int_h <= 7: echo '...。'; break; case $int_h <= 8: echo '起きた。多少二日酔いだが動けなくはない。しかししょっぱなから飛ばすと後でバテる。とりあえずコーヒーを飲んで目を覚ますことに専念すべき。9時から本気出す。'; break; case $int_h <= 10: echo '...。'; break; case $int_h <= 11: echo 'しまった。ニコ動を見ていたら数時間たっていた。しかしまだ慌てる時間じゃない。12時から本気出す。'; break; case $int_h <= 12: echo '世間はランチの時間だ。お腹も空いてきた。区切りの良い12時という時刻を逃すのは惜しいが、社会の流れと自分の時間を合わせることは非常に重要だ。まだ一日は長い。ここはランチを済ませることにしよう。13時から本気出す。'; break; case $int_h <= 14: echo '...。'; break; case $int_h <= 15: echo 'しまった。たらふく食べたらなんだか眠くなってしまい、ついうたた寝をしてしまった。しかし寝起きですぐ動くと体に悪い。まだ一日は長い。16時から本気出す。'; break; case $int_h <= 16: echo '昼寝しすぎた影響か体がだるい。無理しても効果がないのでここは雌伏の時。まだ夜は始まったばかり。17時から本気出す。'; break; case $int_h <= 20: echo '...。'; break; case $int_h <= 21: echo 'しまった。ゲームをやっていたらこんな時間になっていた。この時間から頑張るのも良いが世間はディナーの時間だ。社会の流れと自分の時間を合わせることは非常に重要だ。ここはディナーを済ませることにしよう。22時から本気出す。'; break; case $int_h <= 23: echo 'しまった。ビールを飲んでいたらこんな時間になってしまった。非常に残念だが今日はチャンスがなかった。悔しいので2chに「充実した一日だった」と書き込んでおこう。明日から本気出す。'; break; } echo '</p>'; ?> </body> </html>
長くなりましたが以上となります。ちょっとしたアホなプログラムの紹介となりましたがいかがでしたでしょうか。時間によってウェブサイトの内容を変える、というのは動的ウェブサイトの基本となりますので少しでも参考になれば幸いです。
次の記事では繰り返し処理の『for文』についてやっていきます。ではではこの辺で。またお会いしましょう。
この記事は桜舞が執筆致しました。
著者が愛する小型哺乳類 |
桜舞 春人 Sakurama HarutoISDN時代から様々なコンテンツを制作しているちょっと髪の毛が心配な東京在住のプログラマー。生粋のロングスリーパーで、10時間以上睡眠を取らないと基本的に体調が悪い。好きなだけ寝れる生活を送るのが夢。ゲームとスポーツと音楽が大好き。誰か髪の毛を分けて下さい。 |
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。