指定時刻の取得
そふぃのPHP入門 >> PHP実践リファレンス >> 日付・時刻処理 >> 指定時刻の取得

指定時刻の取得

指定した日付のタイムスタンプを取得―mktime関数

指定した時刻のタイムスタンプを取得するにはmktime()関数を使用します。time()関数では現在時刻のタイムスタンプを取得しましたが、取得したいタイムスタンプが「現在時刻」とは限りません。昨日や一昨日、明日や明後日など、「現在時刻」以外の日時を指定したくなった場合にはmktime()関数を使います。mktime()関数は指定した日付のタイムスタンプを取得してくれる関数です。

書式や使用方法

参考関数

  • mktime() ---- 指定した日時のUNIXタイムスタンプを取得する

書式

  • int mktime( [ int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst ]]]]]]] )

引数がたくさんありますが時間と年月日を指定していくだけなのでそんなに難しくありません。引数で指定した日時をタイムスタンプ値として返してくれます。引数は右から順に省略可能ですが、省略した場合は現在時刻が適用されます。つまり、すべての引数を省略した場合はtime()関数と同じ働きをするって事ですね。

引数は左から順に時、分、秒、月、日、年、サマータイムの順番に指定していきます。日本語で書式情報出した方が分かりやすいかもしれないので参考までに載せておきます。

書式

  • int mktime( [ int [, int [, int [, int [, int [, int [, int サマータイムフラグ ]]]]]]] )

サマータイム引数はPHP5.1.0で廃止されました。

例えば、今年の7月2日のタイムスタンプを取得する場合は以下のように7や2を指定する事ができます。

今年の7月2日のタイムスタンプ取得

  1. <?php
  2. // サマータイムと年の引数を省略しています。
  3. $timestamp = mktime(0, 0, 0, 7, 2);
  4. ?>

次はdate()関数と組み合わせます。今回は「来年の今日の曜日を出力」してみます。

来年の今日は何曜日?

  1. <?php
  2. //「来年の今日」という日時のタイムスタンプを取得する
  3. $timestamp = mktime(0, 0, 0, date("n"), date("j"), date("Y")+1);
  4.  
  5. //取得したタイムスタンプからフルスペルの曜日にフォーマットして出力
  6. echo date("l", $timestamp);
  7. ?>

出力結果

Saturday

date()関数にそれぞれ日・月・年を取得してくれるフォーマット文字(njY)を指定し、そのままmktime()関数の引数として使っています。年の引数は+1として「来年」を指します。

さらに出力部分で、曜日を英字のフルスペルで取得するフォーマット文字"l"を指定し、そのまま出力しています。

mktime関数による日付の有効性確認

mktime()関数は日付の有効性を確認してくれていますので「8月32日」というような指定をした場合でもエラーとはならず、自動的に「9月1日」のタイムスタンプを取得してくれます。

8月32日の計算

  1. <?php
  2. // 不正な日付を指定しているが、自動的に9月1日として扱われる。
  3. $timestamp = mktime(0, 0, 0, 8, 32);
  4. echo date("Y/m/d", $timestamp);
  5. ?>

出力結果

2017/09/01

また、「0日」という日付の扱い方もできます。例えば「4月0日」と指定した場合、mktime()関数は3月の最後の日、つまり3月31日のタイムスタンプを取得してくれます。

4月0日の計算

  1. <?php
  2. // 4月0日、つまり3月31日のタイムスタンプ
  3. $timestamp = mktime(0, 0, 0, 4, 0);
  4. echo date("Y/m/d", $timestamp);
  5. ?>

出力結果

2017/03/31

但し、これだけ便利なmktime()関数でも、年、月、日の全ての引数を0としてしまった場合にはおかしなタイムスタンプになりますので注意して下さい。PHPマニュアルには1999年11月30日として扱われる、なんて書いてありましたが私がやってみたら2004年11月30日になりました。ま、どっちにしろ変なタイムスタンプである事に変わりはないです。

PHP5.1.0からは年月日全てを0にする事が可能なようです。

PHPマニュアル mktime()