2038年問題一覧

PHPで日付から曜日を算出する方法

PHPを使用していると曜日を算出する機会というのが多々ありますよね。

今回の記事では、PHPを使用して曜日を算出する方法について紹介します。

date関数を使用して曜日を算出する

PHPを使用し、曜日を算出する方法の一つにdate関数を使用して曜日を算出する方法があります。

date関数を使用して曜日番号を取得する

・PHPスクリプト

//現在の日付の曜日の番号を出力する
$date = date('w');
echo $date;

//指定日の日付の曜日番号を出力する
$date = '2018-08-08 00:00:00';
echo date('w', strtotime($date));

//指定日の曜日を取得する
$timestamp = mktime(0, 0, 0, 4, 9, 2018);
$date = date('w', $timestamp);
echo $date;

・実行結果(改行等を追加しています)

//現在の日付の曜日番号
0 //日曜日
//指定日の日付の曜日番号
3 //水曜日
//mktime関数で指定日のUnixタイムスタンプを取得して曜日番号を首藤
1 //月曜日

使用方法は、簡単でdate関数にwの引数を与えることで曜日を算出することが出来ます。
wの引数は、曜日を数字で表したもので、0〜6の値が戻り値として戻ってきます。

[参考]

PHPで日付のフォーマットを指定したり、フォーマットの変換をする方法について紹介しています。

この曜日の番号は、0が日曜日からの順番で、6が土曜日になります。表に表すと下記の様になります。

曜日番号 曜日
0 日曜日
1 月曜日
2 火曜日
3 水曜日
4 木曜日
5 金曜日
6 土曜日

指定日を指定して、曜日を出したい場合は、date関数の第二引数にUnixタイムスタンプを渡せば、指定日の曜日を算出することが出来ます。
上記のサンプルプログラムではstrtotime関数、mktime関数でUnixタイムスタンプを取得してdate関数の第二引数に渡しています。

曜日を文字列で取得する

PHPで曜日番号を取得しても実際に使用する際には、番号ではなく文字列の曜日を表示したいということが実際には多いと思います。
次に曜日番号から実際の曜日の文字列を表示する方法について紹介します。
・PHPスクリプト


//配列を使用し、要素順に(日:0〜土:6)を設定する
$week = [
  '日', //0
  '月', //1
  '火', //2
  '水', //3
  '木', //4
  '金', //5
  '土', //6
];

//現在の曜日を取得する
$date = date('w');
//日本語で曜日を出力
echo $week[$date] . '曜日';

・実行結果

日曜日

文字列を格納した配列を曜日番号の順番に作成し、配列のindexから曜日の文字列を取得しています。
date関数を使用すると比較的簡単にシステム日付の曜日だったり、指定日の曜日を取得することが出来ます。
しかし、このdate関数を使用し曜日を取得することには問題もあります。

date関数を使用し曜日を算出するのであれば、64ビットのPHPを使用しよう

date関数を使用し、曜日を算出する問題点は、2038年問題と言われる問題です。この2038年問題とは、Unixタイムスタンプが32Bitの最大表現限界である2,147,483,647を超えてしまいオーバーフローを起こしてしまうもので、日付の変換がうまく出来ないという問題です。Unixタイムスタンプがオーバーフローを起こすと、-2,147,483,647から日付を計算し始めるので正確な曜日を求めることが出来なくなります。
32ビットのPHPで2038年1月19日火曜日 3時14分08秒以降の曜日を算出する場合は、注意が必要です。

しかし、次に紹介するDateTimeクラス(PHP5.2以降で使用可能)を使用して曜日を取得することでも問題を回避することが出来ます。

DateTimeクラスを使用して曜日を算出する

PHP5.2以降のバージョンから、DateTimeクラスというクラスが追加されました。32ビットのPHPを使用して開発している場合は、日付関係の処理は、DateTimeクラスをする方が安全です。

DateTimeクラスを使用して曜日番号を取得する

・PHPスクリプト

//現在の日時を指定する
$date = new DateTime();
//指定した書式で日時を取得し画面表にする
echo $date->format('w');

//現在の日時を指定する
$date = new DateTime('2018-04-02 23:59:59');
//指定した書式で日時を取得し画面表にする
echo $date->format('w');

・実行結果

//現在の日付の曜日番号
0 //日曜日
//指定日の日付の曜日番号
1 //月曜日

取得される曜日番号は、date関数を使用した場合と同じです。なので曜日番号から文字列の曜日を出したい場合は、下記の様にすると取得することが出来ます。

曜日を文字列で取得する

・PHPスクリプト

$week = [
  '日', //0
  '月', //1
  '火', //2
  '水', //3
  '木', //4
  '金', //5
  '土', //6
];

//現在の日時を指定する
$date = new DateTime();
//指定した書式で日時を取得し画面表にする
$date_no =  $date->format('w');

echo $week[$date_no] . '曜日';

・実行結果

日曜日 //曜日番号0

今回の記事では、PHPで日付から曜日を算出方法について紹介しました。

32ビットのPHPでdate関数を使用することは、後々問題になる可能性があります。下記の記事にもPHPでの日付の処理について紹介しているので興味のある方は、参照してみてください。

PHPの日付時刻関連のライブラリ

PHPには、日付時刻関係の有名なライブラリが、あります。
曜日を算出したり、日付の差などの比較など色々な機能が直感的に行えます。

興味のある方は、下記の記事を参照ください。

PHPで日付関連の処理をするのに便利なCarbonの使用方法について紹介しています。CarbonはGitHubでも多数のスターの付く人気の日付関連のライブラリーです。
PHPの日付・時刻ライブラリChronosの機能について紹介しています。Carbonとの違いについても説明しています。