PHPの基礎 - 日時
概要
PHPの組み込み関数において、日時に関する関数を記載する。
日時を取得する(time, date)
日時を指定するフォーマットを取得する。
string date(string format [, int timestamp]) 引数で指定したフォーマットで日付文字列を取得する。 2番目の引数で、取得する日時を指定する。省略する場合は、現在の日時を取得する。 引数: format 日付のフォーマット timestamp フォーマットの対象となる日時 戻り値: フォーマットされた日付文字列
フォーマットの対象となるタイムスタンプで指定可能な範囲は、Fri, 13 Dec 1901 20:45:54 GMTからTue, 19 Jan 2038 03:14:07 GMTまでとなっている。
省略する場合は、time関数で取得できる現在日時の値が対象となる。
下表に、指定可能なフォーマットの種類を示す。
| フォーマット | 意味 | 例 | 
|---|---|---|
| j | 日(ゼロパディング無し) | 1から31 | 
| d | 日(ゼロパディング) | 01から31 | 
| D | 曜日(3文字のテキスト形式) | MonからSun | 
| l | 曜日(フルスペル形式) | SundayからSaturday | 
| N | ISO-8601形式における曜日の数値表現 | 1(月曜日)から7(日曜日) | 
| S | 英語形式の序数を表すサフィックス(2文字) | st、nd、rdまたはth jと一緒に使用する  | 
| w | 曜日。数値 | 0(日曜)から6(土曜) | 
| W | ISO-8601形式における月曜日から始まる年単位の週番号(数値) | 例: 42(1年の第42週目) | 
| z | 年間の通算日(ゼロから開始) | 0から365 | 
| フォーマット | 意味 | 例 | 
|---|---|---|
| m | 月(ゼロパディング無し) | 1から12 | 
| n | 月(ゼロパディング) | 01から12 | 
| M | 月(3文字のテキスト形式) | JanからDec | 
| F | 月(フルスペル形式) | JanuaryからDecember | 
| t | 指定した月の日数 | 28から31 | 
| フォーマット | 意味 | 例 | 
|---|---|---|
| y | 年(2桁の数字) | 例: 99、03、10 | 
| Y | 年(4桁の数字) | 例: 1999、2003、2010 | 
| o | ISO-8601形式の年 Yとほぼ同じであるが、ISO週番号(W)が前年あるいは翌年に属する場合がある点で異なる  | 
例: 1999、2003、2010 | 
| L | 閏年であるかどうかを表す論理値 | 1 : 閏年 0 : 閏年ではない  | 
| フォーマット | 意味 | 例 | 
|---|---|---|
| s | 秒(ゼロパディング) | 00から59 | 
| i | 分(ゼロパディング) | 00から59 | 
| h | 時(12時間単位、ゼロパディング) | 01から12 | 
| H | 時(24時間単位、ゼロパディング) | 00から23 | 
| g | 時(12時間単位、パディング無し) | 1から12 | 
| G | 時(24時間単位、パディング無し) | 0から23 | 
| a | 午前または午後(小文字) | amまたはpm | 
| A | 午前または午後(大文字) | AMまたはPM | 
| B | スウォッチインターネット時間(Swatch) | 000から999 | 
| フォーマット | 意味 | 例 | 
|---|---|---|
| e | タイムゾーン識別子 | 例: UTC、GMT、Atlantic / Azores | 
| l | サマータイム中かどうか | 1 : サマータイム 0 : サマータイムではない  | 
| O | グリニッジ標準時(GMT)との時間差 | 例: +0900 | 
| T | サーバのタイムゾーンの設定 | 例: EST、MDT ... | 
| Z | タイムゾーンのオフセット秒数 UTCの西側のタイムゾーン用のオフセットは常に負である。 UTCの東側のオフセットは常に正である。  | 
-43200から43200 | 
| フォーマット | 意味 | 例 | 
|---|---|---|
| c | ISO8601形式の日付 | 例: 2020-01-01T15:19:21+00:00 | 
| r | RFC822に基づく日付 | 例: Thu, 21 Jan 2020 16:01:07 +0200 | 
| U | Unix時(1970年1月1日0時0分0秒)からの秒数 | -- | 
例えば、2020年01月01日のような日付文字列を取得する場合は、date('Y年m月d日');と記述する。
このように、フォーマット文字列で定義されていない文字を記述する場合、単に文字列として表示する。
また、フォーマット文字列と同じ文字において、文字として表示する場合は、¥でエスケープする。
date('Y m d');      --> 2020 01 01
date('Y年m月d日');  --> 2020年01月01日
date('d day');      --> 01 01am20
date('d ¥d¥a¥y');   --> 01 day
date('c');
※注意
文字をエスケープした結果、ダブルクォーテーションで囲まれた文字列の中で特別な意味を持つ文字になることがある(例: ¥n等)
これを避けるには、¥¥nのように¥自身もエスケープする必要がある。
次に、第2引数であるタイムスタンプについても記載する。
第2引数を省略する場合は、初期値としてtime関数で取得できる現在時刻がフォーマットの対象となる。
int time(void) 現在時刻をUnix時刻(1970年1月1日 00:00:00 GMT)からの通算秒として返す。 引数: なし 戻り値: 通算の秒を表す数値
Unix時刻とは、1970年1月1日 00:00:00を0として、1秒経過するごとに1ずつ増加させた値となる。
例えば、この値を使用して取得した値に+60した値は、現在より1分後の時間となる。
日時を個々に取得する(getdate)
日時の各値を個々に取得するには、時間・分・秒等を連想配列で取得する。
 
array getdate([int timestamp]) 日付情報を有する連想配列を取得する。 第1引数に取得する日時を指定するが、省略する場合は現在の日時を取得する。 引数: timestamp 取得の対象となる日時 戻り値: 各値が格納された連想配列
下表に、キーに対応する形で日時に関する各値を取得する。
| キー | 対応する値 | 例 | 
|---|---|---|
| seconds | 秒(数値) | 例: 0から59 | 
| minutes | 分(数値) | 例: 0から59 | 
| hours | 時(数値) | 例: 0から23 | 
| mday | 月単位の日(数値) | 例: 1から31 | 
| wday | 曜日(数値) | 例: 0(日曜)から6(土曜) | 
| mon | 月(数値) | 例: 1から12 | 
| year | 年(4桁の数値) | 例: 1999、2003、2020 | 
| yday | 年単位の日(数値) | 例: 0から365 | 
| weekday | 曜日(フルスペルの文字) | 例: SundayからSaturday | 
| month | 月(フルスペルの文字) | 例: January から December | 
| 0 | UNIX時刻(1970年1月1日)からの秒数 | 通常は、-2147483648から2147483647 | 
以下のように、getdate関数で値を取得した後、各値を連想配列のキーを指定して取得する。
 $today = getdate();
 
 print($today['month']);
 print($today['hours'].'時'.$today['minutes'].'分'.$today['seconds'].'秒');
以下の例では、現在時刻を取得して表示している。
 <?php
    $today = getdate();
 
    print($today['year'].'年'.$today['mon'].'月'.$today['mday'].'日');
    print($today['hours'].'時'.$today['minutes'].'分'.$today['seconds'].'秒');
    //-> 2020年1月1日15時30分50秒
 ?>
日時からタイムスタンプを取得する(mktime)
年月日と時間を指定して、その日時のタイムスタンプを取得する方法を記載する。
タイムスタンプとは、1970年1月1日00:00:00 GMTから指定された時刻までの通算秒を表す数値である。
int mktime([int hour [, int minute [, int second [, int month [, int day [, int year]]]]]]) タイムスタンプを表す数値を取得する。 引数は右から省略可能で、省略する引数は現在の値が使用される。 引数: hour 時間 minute 分 second 秒 month 月 day 日 year 年 戻り値: タイムスタンプを表す数値
以下の例では、現在の日時が2020/01/01の場合である。
 $timestamp = mktime(9, 12, 30);         //--> 2006/05/03 9:12:30のタイプスタンプ
 $timestamp = mktime(9, 12, 30, 6);      //--> 2006/06/03 9:12:30のタイプスタンプ
 $timestamp = mktime(9, 12, 30, 6, 17);  //--> 2006/06/17 9:12:30のタイプスタンプ
また、ある日付の45日後のタイムスタンプを求める場合は、以下のように記述する。
9行目のmktime(0, 0, 0, 10, 46, 2020);では、日付の値が10月46日となるが、自動的に計算される。
 // 日付を2020/10/01とする
 $today_month = 10;
 $today_day = 1;
 $today_year = 2020;
 
 $timestamp = mktime(0, 0, 0, $today_month, $today_day, $today_year);
 
 $today_day += 45;
 
 $new_timestamp = mktime(0, 0, 0, $today_month, $today_day, $today_year);
以下の例では、現在の日付から50日後のタイムスタンプを求めて表示している。
 <?php
    $today = getdate();
    $today_month = $today['mon'];
    $today_day = $today['mday'];
    $today_year = $today['year'];
 
    $timestamp = mktime(0, 0, 0, $today_month, $today_day, $today_year);
 
    print('現在の日時は<br>');
    print(date('Y年m月d日', $timestamp).'<br>');
    print('です。<br>');
    print('タイムスタンプは'.$timestamp.'です。<br><br>');
 
    print('今日から45日後は<br>');
 
    $today_day += 50;
    $timestamp = mktime(0, 0, 0, $today_month, $today_day, $today_year);
 
    print(date('Y年m月d日', $timestamp).'<br>');
    print('です。<br>');
    print('タイムスタンプは'.$timestamp.'です。<br>');
 ?>
指定の形式にフォーマットされた日時を取得(strftime)
現在の日時や指定したタイムスタンプの値を指定した形式で取得するには、strftime関数を使用する。
string strftime(string $format [, int $timestamp ]) 指定したtimestampや現在のローカル日時を使用して、指定したフォーマット文字列に基づき文字列を返す。 月や曜日の名前、その他の言語依存の文字列は、setlocale関数で設定された現在のロケールを優先して表示される。 引数: $format フォーマット形式(詳細は後述) $timestamp 対象となるタイムスタンプ 戻り値: フォーマットされた日時
第1引数に指定するフォーマット形式を使用して、現在の日時を文字列として取得する。
第2引数を指定する場合は、引数に指定したタイムスタンプの値を対象とする。
フォーマット形式は、文字列の中に変換指定子と呼ばれるものを組み合わせて指定する。
以下に、変換指定子を示す。
数多くの変換指定子があるが、必要な変換指定子を組み合わせて、文字列と合わせて使用する。
%a - 現在のロケールに基づく短縮された曜日の名前
%A - 現在のロケールに基づく完全な曜日の名前
%b - 現在のロケールに基づく短縮された月の名前
%B - 現在のロケールに基づく完全な月の名前
%c - 現在のロケールに基づく適当な日付と時間の表現
%C - 世紀(西暦を100で割り、整数に丸めたもの。00から99)
%d - 日付を10進数で表現(01から31)
%D - %m/%d/%y と同じ
%e - 月単位の日付を10進数で表したもの。日付が1桁の場合は、前に空白を1つ付加する。(' 1'から'31') 
%g - 世紀以外は、%Gと同じ。
%G - ISO週番号(%Vを参照)に対応する4桁の年。これは、ISO週番号が前年または次年に属するかにより使用される年が異なる事を除き、
     %Yと同じフォーマットと値である。
%h - %bと同じ。
%H - 時間を24時間表示の10進数で表現(00から23まで)
%I - 時間を12時間表示の10進数で表現(01から12まで)
%j - 年間での日付を10進数で表現(001から366)
%m - 月を10進数で表現(01から12)
%M - 分を10進数で表現(00から59)
%n - 改行文字
%p - 指定した時間により、'am'または'pm'または現在のロケールのそれに対応する文字列
%r - a.m.およびp.m.表記で表した時間
%R - 24時間表記で表した時間
%S - 秒を10進数で表現
%t - タブ文字
%T - 現在の時間(%H:%M:%Sに等しい)
%u - 10進数表記の曜日(1から7の範囲で表し、1が月曜日)
%U - 年間で何番目の週であるかを10進数で表現(年間で最初の日曜を最初の週の最初の日として数える)
%V - ISO 8601:1988で規定された現在の年の週番号の10進数表現で、01から53までの範囲となる
     1は最初の週で、その週は現在の年に最低4日はある
     週は月曜日から始まる(指定したタイムスタンプの週番号に対応する年を表すには、%Gあるいは%gを指定する)
%W - 現在の年で何番目の週であるかを10進数で表現
     年間で最初の月曜を最初の週の最初の日として数える
%w - 曜日を10進数で表現(日曜は0である)
%x - 時間を除いた日付を現在のロケールに基づき表現
%X - 日付を除いた時間を現在のロケールに基づき表現
%y - 世紀の部分を除いた年を10進数として表現(00から99までの範囲)
%Y - 世紀を含む年を10進数で表現
%zおよび%Z - タイムゾーンまたはその名前または短縮形
%% - 文字リテラル'%'
例えば、以下のように記述する。
 // 変数strには、2020 / 10 / 01 21:10:50等が代入される
 $str = strftime("%Y / %m / %d %H:%M:%S");
 <?php
    print(strftime("%Y/%m/%d %H:%M:%S").'<br>');  //--> 2020/10/01 21:10:50
    print(strftime("%B, %d(%A)").'<br>');         //--> October, 01(Thursday)
 ?>