PHPの基礎 - 日時

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

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



Carbonライブラリ

Carbonライブラリは、日付操作をする場合に使用されるライブラリである。

Carbonライブラリのインストール

まず、Composerをインストールする。
Composerのインストールは、インストール - Laravel#Composerのインストールのページを参照すること。

次に、プロジェクトディレクトリに移動して、Carbonライブラリをインストールする。

composer require nesbot/carbon


Carbonライブラリの使用

 <?php
 
 // Composerのautoloadを読み込み
 require 'vendor/autoload.php';
 
 // Carbonクラスをインポート
 use Carbon\Carbon;
 
 // 現在の日時を標準フォーマットで表示
 // 出力: Current Date and Time: 2024-11-05 10:30:45
 echo "Current Date and Time: " . Carbon::now() . "\n";
 
 // 日本語でのローカライズされた表示
 // 出力: 日本語での表示: 2024年11月5日火曜日 10時30分45秒
 echo "日本語での表示: " . Carbon::now()->locale('ja')->isoFormat('LLLL') . "\n";
 
 // 年月日のみを表示
 // 出力: 年月日: 2024-11-05
 echo "年月日: " . Carbon::now()->toDateString() . "\n";
 
 // 時刻のみを表示
 // 出力: 時刻: 10:30:45
 echo "時刻: " . Carbon::now()->toTimeString() . "\n";
 
 // カスタムフォーマットでの表示
 // 出力: カスタムフォーマット: 2024年11月05日 10時30分45秒
 echo "カスタムフォーマット: " . Carbon::now()->format('Y年m月d日 H時i分s秒') . "\n";


フォーマット文字'LLLL'とは、「曜日, 年月日, 時刻」を含む最も詳細な日時表示形式を指定する。
これは、ロケールによって出力形式が自動的に変わる。

'L'の数が増えるほど、より詳細な情報が表示される。

  • L
    日付の短い形式
  • LL
    日付の長い形式
  • LLL
    日付と時刻
  • LLLL
    曜日、日付、時刻を含む最も完全な形式


 // 日本語での表示
 // 出力: 2024年11月5日火曜日 10時30分45秒
 Carbon::now()->locale('ja')->isoFormat('LLLL')
 
 // 英語での表示
 // 出力: Tuesday, November 5, 2024 10:30 AM
 Carbon::now()->locale('en')->isoFormat('LLLL')
 
 // フランス語での表示
 // 出力: mardi 5 novembre 2024 10:30
 Carbon::now()->locale('fr')->isoFormat('LLLL')


 <?php
 // 様々なisoFormatパターンの例
 
 $date = Carbon::now();
 
 echo $date->isoFormat('L');     // 2024/11/05
 echo $date->isoFormat('LL');    // 2024年11月5日
 echo $date->isoFormat('LLL');   // 2024年11月5日 10:30
 echo $date->isoFormat('LLLL');  // 2024年11月5日火曜日 10:30
 
 ?>