こんにちは!エンジニアのノムラです。
現在時刻や指定した日時のUNIXタイムスタンプを取得して、日時を比較したり、指定した範囲の日時までのデータを処理するといったことはよくあります。
この記事では、
【基礎】time関数・mktime関数を使って取得
【基礎】UNIXタイムスタンプのフォーマット
【応用】timezomeの設定
【応用】その他日時を扱う関数
など、PHPでUNIXタイムスタンプを取得する方法や日時を扱う方法について解説していきたいと思います。
開発を進めていく中で、日時の操作や表示はとても重要になるので、しっかりマスターしていきましょう。
UNIXタイムスタンプとは
UNIXタイムスタンプとは、コンピューターのシステム時刻の一種で、協定世界時(UTC)での1970年1月1日(午前0時0分0秒)からの経過時間を指します。
例えば、「6月11日12時2分」のUNIXタイムスタンプは「1528686124」と表示されます。
time関数で取得
PHPでは、UNIXタイムスタンプを取得することができる関数としてtime関数があります。
time関数は以下のように定義します。
書き方:
int time(void)
引数:
なし
返り値:
Unixタイムスタンプをint型で返します。
実際にサンプルプログラムでtime関数の使い方を見ていきましょう。
以下に現在と指定した日時のUnixタイムスタンプを取得する方法を記述します。
サンプルプログラム1
//現在のタイムスタンプを取得 echo '現在のUnixタイムスタンプ:'.time(); echo '<br>'; //3日後のタイムスタンプを取得 $nweek = time() + (3 * 24 * 60 * 60); echo '3日後のUnixタイムスタンプ:'.$nweek;
実行結果:
現在のUnixタイムスタンプ:1505454884 3日後のUnixタイムスタンプ:1505714084
このようにtime関数を使用すれば、現在の日時や指定した日時のUnixタイムスタンプを簡単に取得できます。
また、time関数で取得した値はint型であるため、以下のように日時を比較するときに便利です。
サンプルプログラム2
//現在のタイムスタンプを取得 $time1 = time(); //3日後のタイムスタンプを取得 $time2 = time() + (3 * 24 * 60 * 60); if($time1 < $time2){ echo '$time2が大きい値です'; }
実行結果:
$time2が大きい値です
このように時刻の比較は、一定の日付までのデータを取得したり、時刻によって処理を分岐するときによく使用します。
mktime関数で取得
time関数と同じく、UNIXタイムスタンプを取得する関数としてmktime関数があります。
time関数との違いとしては、time関数は現在時刻のUNIXタイムスタンプを取得することができるのに対し、mktime関数は指定した日時のUNIXタイムスタンプを取得することができるという点です。
書き方:
int mktime( [ 時 [, 分 [, 秒 [, 月 [, 日 [, 年 [, int is_dst ]]]]]]] )
引数:
引数には年・月・日・時・分・秒などを指定することができます。
引数を全て省略した場合は現在のタイムスタンプを取得します。
返り値:
int型でUnixタイムスタンプの値を返します。
実際にサンプルプログラムで使ってみましょう。
サンプルプログラム
//指定した日時のタイムスタンプを取得 $timestamp = mktime(0, 0, 0, 8, 1, 2017); echo $timestamp;
実行結果:
1501545600
サンプルでは2017/8/1の日付を指定しています。
mktime関数については、以下の記事でも詳しく解説していますので、ぜひ参考にしてみてくださいね!
Unixタイムスタンプをフォーマットする
UNIXタイムスタンプの取得方法について解説しましたが、WEBサービスで日時を表示する際、UNIXタイムスタンプが表示されているところはみたことがないと思います。
time関数やmktime関数で取得したUNIXタイムスタンプは、date関数を使用することにより指定したフォーマットで日時として取得することができます。
date関数は以下のように定義します。
書き方:
string date ( string $フォーマット [, int $タイムスタンプ = time() ] )
以下にdate関数を使用して、UNIXタイムスタンプをフォーマットする方法を記述します。
サンプルプログラム
//現在の日時を取得 echo date('Y/m/d', time()); echo '<br>'; //3日後のタイムスタンプを取得 $nweek = time() + (7 * 21 * 60 * 60); //3日後の日時を取得 echo date('Y/m/d', $nweek);
実行結果:
2017/09/15 2017/09/21
date関数を使用すれば日付のフォーマットを指定して、引数にtime関数を指定すれば現在の日時を取得することができます。
また、タイムスタンプが設定された変数を指定して日時を取得することもできます。
date関数の詳しい使いかたについては、以下の記事でも詳しく解説していますのでぜひ参考にしてみてください!
日時がずれる?タイムゾーンの設定(timezone)
UNIXタイムスタンプを取得してフォーマットしてみたら、時刻がずれていた!という方がいるかもしれません。
そんな時は、タイムゾーンの設定を行いましょう。
タイムゾーンとは、地域によって異なる標準時刻のことを指します。
インターネットに接続されているコンピューターを時刻で管理するときに、それぞれの時刻のタイムゾーンを指定すると、システム内部で時刻の不整合が発生し、通信に影響を及ぼしてしまいます。
そのため、コンピューターやシステムで管理する時刻はタイムゾーンは合わせる必要があります。
タイムゾーンはPHPの設定ファイルであるPHP.iniを設定する方法と、date_default_timezone_set関数を指定して設定する方法があります。
以下にdate_default_timezone_set関数を使用して、タイムゾーンを指定する方法を紹介します。
サンプルプログラム
//日本に設定 date_default_timezone_set('Asia/Tokyo'); print date("Y/m/d G:i:s");
実行結果:
2017/09/15 15:18:23
タイムゾーンを設定する方法については、以下の記事で詳しく解説していますのでぜひ参考にしてください。
その他日時を扱う関数
PHPには他にも日時を扱うことができる関数があります。
ここでは、その例として、strtotime関数とmicrotime関数を紹介したいと思います。
指定された文字列をUNIXタイムスタンプに変換
strtotime関数は、指定した文字列をUNIXタイムスタンプに変換します。
strtotime関数は、以下のように記述します。
書き方:
int strtotime ( string $日付/日時文字列 [, int $now = time() ] )
引数:
第一引数には、日付/日時を文字列で指定します。
第二引数を指定した場合は、返される値を計算するために使用するタイムスタンプを指定できます。
返り値:
処理が成功するとタイムスタンプを返し、失敗するとFALSEを返します。
以下にstrtotime関数を使用して、指定した日付からUNIXタイムスタンプを取得するサンプルを紹介します。
サンプルプログラム
//現在時刻から+1をtomorrowで指定 $time = strtotime('tomorrow'); echo $time;
実行結果:
1528754400
このように引数にtomorrowを指定すれば現在の日時から+1日のUNIXタイムスタンプを取得できます。
他にもより詳しく指定することができるので、strtotime関数の詳しい使い方については、以下の記事をぜひ参考にしてください!
UNIXタイムスタンプをマイクロ秒数で取得
現在のUnixタイムスタンプをマイクロ秒まで取得するにはmicrotime関数を使用します。
time関数は秒単位までしかタイムスタンプを取得できないため、マイクロ秒単位で取得したい場合はこちらを使用します。
microtime関数は、以下のように記述します。
書き方:
icrotime ([ bool $get_as_float = false ] )
引数:
$get_as_floatをTRUEで指定すると、Unixタイムスタンプの経過秒数をマイクロ秒数で取得します。
TRUEを指定しないとUnixタイムスタンプを秒数で取得します。
以下にmicrotime関数を使用して、現在の日時からUnixタイムスタンプをマイクロ秒数で取得するサンプルを紹介します。
サンプルプログラム
//現在に日時をマイクロ秒数で取得 $time = microtime(true); echo $time;
実行結果:
1505467944.97
このようにmicrotimeに引数でtrueを指定するだけで、Unixタイムスタンプをマイクロ秒数で取得することができます。
まとめ
ここではUNIXタイムスタンプを取得するtime系関数の、
- UNIXタイムスタンプとは何か
- time関数で現在のUNIXタイムスタンプを取得する方法
- mktime関数で日付をUNIXタイムスタンプで取得する方法
- timezone関数でタイムゾーンを指定する方法
- その他日時を扱う関数
などについて解説しました。
UNIXタイムスタンプは時刻を管理したり、異なる日時のタイムスタンプを比較するときによく使用しますので、よく理解しておきましょう。
もしtime関数の使い方を忘れてしまったら、この記事を思い出してくださいね!