PHPの基礎 - 日時

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
2021年3月4日 (木) 15:19時点におけるWiki (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

概要

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>');
 ?>