PHPで日付や曜日の取得と表示や改行コードの使い方

Webサイトで日付や時間、曜日を扱って表示または情報を使ってなんらかの制御をさせたいことがあるかと思います。
クライアントサイドスクリプトのJavaScriptでも日付や時間の取得が可能ですが、ユーザー側でJavaScriptをオフにしている可能性も考えて、サーバーサイドスクリプトのPHPでの取得方法をご紹介します。

ここでは、PHPで日時・曜日の取得と表示方法をご紹介とともに、PHPでつまずきやすい改行コードの記述も説明します。

 

PHPでの日付・曜日の取得と表示

日付・曜日の取得と表示は以下のようなコードになります。

<?php

$date = new DateTime('Asia/Tokyo');
$dayOfTheWeek = array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
$today = $date->format('Y-m-d') . PHP_EOL . $dayOfTheWeek[$date->format('w')];

echo nl2br($today, false);

?>

 
変数$dateにDateTimeクラスでTokyoの情報を取得して格納。WordPressではタイムゾーンがUTC(世界標準時)になっています。設定からタイムゾーンの変更で変化する可能性があるのでDateTimeでしっかりとタイムゾーンを設定して取得します。

変数$dayOfTheWeekには配列で日曜日から土曜日までを格納。PHP5.2からサポートされたdateフォーマットを使って細かい情報を取得してきます。
「Y-m-d」で日付を取得、「w」で曜日の情報を取得します。
「w」はWeekで、0〜6(日〜土曜日)というかたちの数値での取得になります。

$dayOfTheWeekのインデックス番号として「$date->format(‘w’)」で取得した番号を入れてあげれば配列から曜日が取れますね。

実際の表示がこちら

ブラウザ上

ソースコード上

 

上記の書き方で日付のあと改行させて曜日を表示させました。
とくに改行させない場合はよいのですがデザイン上、改行させることがある時のちょっとした注意点があります。

改行コードに「PHP_EOL」、echoで「nl2br()」を使う意味も説明していきます。

 

PHPでの改行コードの書き方

デザイン上、改行を入れたい場合があります。
PHPの改行コードは、「ソースコード上では改行されているのにブラウザでは改行されていない」とか「OSが違うと改行されてい」という話をよく聞きます。

ブラウザではHTMLのbrタグがないと改行されないですし、PHPの改行コードはOSごとでことなります。

OSごとの改行コードはこちら。
Windows \r\n
MacOS \r
UNIX系 \n

OSごとで改行は「PHP_EOL」を使います。
PHP_EOLはPHPの定数で、LinuxやWindowsなど、サーバのOSを自動判定して改行文字を自動的に設定してくれます。

例えば、UNIX系の場合、

"\n" //ソースコード上での改行。
PHP_EOL //ソースコード上での改行(OSは自動判定)。
"<br>\n" //ブラウザとソースコード両方で改行させる。(OSでうまくいかないことも)

この3パターンを使うことになるのですが、どれも完璧ではありません。

別に「”<br>”」でいいじゃん、って思うかもしれませんが、HTMLのコードが複雑になるにつれてちゃんと出力されているかどうかの確認ができなくなります。
またソースコード上でも改行なのかどうかが正確でないと、別の処理のときにうまくプログラムを動かせない場合もあります。
なのでPHPではHTMLではない改行コードを使うことをおすすめします。

そこで、PHPのnl2br()という関数を使います。
nl2br()は、改行コードの前に<br>を挿入してくれます。
また、第2引数がtrueならxhtml準拠の改行タグ「<br />」を挿入、falseならHTML5の「<br>」が挿入されます。
第2引数の指定がない場合は「<br />」になります。

要するにnl2br()を使うことでHTMLのbrタグが入るので、ブラウザでもソースコード上でも改行してくれるんです。
これに加えて、OSごとに改行文字を自動的に設定してくれる定数「PHP_EOL」を使えば、問題なくどのOSでもブラウザ上もソースコード上もしっかり改行されるようになります。

以下の部分ですね。

$today = $date->format('Y-m-d') . PHP_EOL . $dayOfTheWeek[$date->format('w')];

echo nl2br($today, false);

 
$todayという変数に格納しない場合はこんな感じです。

echo nl2br($date->format('Y-m-d') . PHP_EOL . $dayOfTheWeek[$date->format('w')], false);

 
ご自身の扱いやすい書き方で書いてください。

 
これでDateTimeの情報から配列も使いつつ、日付と曜日の表示ができました。
デザイン上、改行が必要な場合はnl2br()やPHP_EOLを使ってみてください。