タイムスタンプの整形1
そふぃのPHP入門 >> PHP実践リファレンス >> 日付・時刻処理 >> タイムスタンプの整形1

タイムスタンプの整形1

タイムスタンプの整形

タイムスタンプはそのままだと理解しづらい形式なので、人間が見て分かりやすい形式に整形し直したいところです。PHPではタイムスタンプ整形のための関数も用意されています。このように、形式を変換し直す事を「書式化」といいます。こういう「書式化」の事をフォーマットと呼んだりするので覚えておいて下さい。

日付や時刻を扱う場合はタイムスタンプという数値のみで扱われますので書式化=計算みたいなもんですが、これが文字列なんかだと書式化(フォーマット)にもいろいろ種類がでてきます。整数値に直してやったり、桁数を整形してやったり・・・とこういった処理も全て書式化(フォーマット)と呼ばれます。

日付・時刻を書式化する―date()関数

書式や使用方法

タイムスタンプに関しては、このフォーマット(書式化)という便利な機能を備えている関数の代表がdate()関数です。

参考関数

  • date() ---- 日付・時刻を書式化する

書式

  • string date( string format [, int timestamp ] )

第1引数にフォーマットしたい文字列、第2引数にタイムスタンプを指定する事によって、タイムスタンプをフォーマットして返してくれます。

ここで問題になるのは第1引数のフォーマットです。どういったものを指定すればタイムスタンプを「年」や「日」に直してくれるのかが気になるところですが、これは予め決められています。

例えば「日付」を取得したければd(小文字)もしくは(小文字)などの文字が「日付を取得する書式」と決まっています。このようにフォーマットする為に定められた特定の文字をフォーマット文字と言います。

いろいろと解説するよりもサンプルを見た方が早いかもしれませんので早速簡単なサンプルです。以下のサンプルは今日の日付を出力します。date()関数の日付を取得するために定められたフォーマット文字(d)を第1引数に指定します。

  1. <?php
  2. print date("d", time())."<br />\n"; // 先頭に0を付ける形式(1桁の時)
  3. print date('j', time()); // 先頭に0を付けない形式
  4. ?>

出力結果

24
24

「タイムスタンプから日付を得る」という意味を持つd(フォーマット文字)に従ってフォーマットした値が出力されます。第2引数には現在のタイムスタンプである、time()を指定しています。

dはどちらも「日付を得る」フォーマット文字ですが違いは日付が1桁の時に先頭に0を付けるかどうかの違いです。つまり日付は必ず2桁で表すか、日付が1桁であっても素直に1桁のまま表すかが違います。

引数省略の場合

さらに、date()の第2引数は省略する事ができます。省略した場合には現在時刻、つまりtime()の値が適用されます。

という事は、上記のスクリプトは以下のように書き直しても全く同じ動作をします。

  1. <?php
  2. print date("d")."<br />\n"; // 先頭に0を付ける形式(1桁の時)
  3. print date('j'); // 先頭に0を付けない形式
  4. ?>

出力結果

24
24

第2引数のタイムスタンプは現在時刻を適用させる分には省略しても一緒なので、通常はこちらで指定した方が楽でしょう。「指定した日付」のタイムスタンプを適用させたい場合などには第2引数は必須になってきます。つまり、「明日」とか「来年」や、もっと具体的に「○年○月○日」などのタイムスタンプをフォーマットしたい場合などは第2引数にその時刻のタイムスタンプを指定します。

フォーマット文字一覧

dだけでは日付しか取得できませんが、「年」でも「月」でも要領は同じで、定められたフォーマット文字を指定していくだけです。d以外にもたくさんのフォーマット文字が用意されていますのでまずはご覧下さい。

フォーマット文字 説明
a 午前/午後(am または pm)
A 午前/午後(AM または PM)
B インターネット時間(000 ~ 999)
d 2桁で示す日付(01 ~ 31)
D 3文字の曜日(Sun ~ Sat)
F フルスペルの月(January ~ December)
g 先頭に 0 をつけない12時間単位の時間(1 ~ 12)
G 先頭に 0 をつけない24時間単位の時間(0 ~ 23)
h 2桁で示す12時間単位の時間(01 ~ 12)
H 2桁で示す24時間単位の時間(00 ~ 23)
i 2桁の分(00 ~ 59)
I サマータイム中かどうかのフラグ(1 または 0)
j 先頭に 0 をつけない日付(1 ~ 31)
l フルスペルの曜日(Sunday ~ Saturday)
L 閏年かどうかのフラグ(1 または 0)
m 2桁で示す月(01 ~ 12)
M 3文字で表す月(Jan ~ Dec)
n 先頭に 0 をつけない月(1 ~ 12)
O グリニッジ標準時(GMT)との時間差(+0900 など)
r RFC822に定義されている日付形式(Thu, 21 Dec 2000 16:01:07 +0900 など)
s 2桁で示す秒(00 ~ 59)
S 2文字で表す英語形式の序数を表すサフィックス(st, nd, rd または th)
t 指定した月の日数(28 ~ 31)
T ローカルマシーンのタイムゾーンの設定
U Unix時間(Unixタイムスタンプ:time()の値と同じ)
w 数値で示す曜日(0:日 ~ 6:土)
W ISO-8601 月曜日に始まる年単位の週番号(42:1年の第42週目)
y 西暦を2桁を示す年
Y 西暦を4桁で示す年
z 年間の通算日― 1月1日からの通算日数(0 ~ 366)
Z タイムゾーンのオフセット秒数(-43200 ~ 43200)

インターネット時間とは

ここでちょっとおもしろい時間の概念を紹介します。フォーマット文字の B で表わされるインターネット時間というものですが、これは1日を1000等分して000~999という形式で表す時間単位の事です。この概念を打ち出したのが時計メーカーとして有名なスウォッチです。スイスの会社なので時間の基準はスイスに設定されています。(確かスイスのSwatch本社がある街に設定してあったような気が・・)

インターネット時間の利点ですが、全世界共通時間として時差を気にせず使えるように考案されています。まず見慣れたxx:xx:xxという形式だと、各地によってxに入る数値が違ってきます。例えば日本で夜中の2時だとしたらGMTでは17時という風に2やら17やら各地で違う数値になりますが、インターネット時計ならどの地方から見ても@750という形式になります。インターネット時間というだけあって、単位のマークまで@ですね~~w。

24時間を「ビート」という1000単位で分けるので@750は「750ビート」とう読み方をされるそうです。@1(1ビート)は1分26秒程度です。

スウォッチ社が打ち出したインターネット時間の概念、果たして浸透するのかどうかは不明ですが12進数の概念をきれいさっぱり!!捨て去ったこの時間の概念はとても面白いので今後の展開に注目です。

フォーマット文字と通常の文字

さて、肝心のdate()関数に話を戻します。date()関数の第1引数に指定した値は、フォーマット文字以外はそのまま出力されます。つまり、フォーマット文字以外の文字は全てそのまま返り値に渡されるので通常の文字とフォーマット文字を混在して書く事ができます。

  1. <?php
  2. echo date("Y年m月d日 H時i分s秒"); // 現在時刻を表示します
  3. ?>

出力結果

2017年10月24日 16時42分38秒

フォーマット文字のエスケープ処理

フォーマット文字自体をそのまま(文字として)出力したい場合は\でエスケープします。

フォーマット文字と言っても文字列には変わりないのでクォートしますが、シングルクォーテーションとダブルクォーテーションではエスケープの仕方が違います。これはシングルクォーテーションが特殊文字(\n\tなど)や変数を解釈しないのに対してダブルクォーテーションは解釈してくれるからですが、厄介な事にフォーマット文字にも"n"や"t"が存在します。

このフォーマット文字を使用したい場合に

  1. <?php
  2. date("\n");
  3. // フォーマット文字のnを使用して月を表示するつもりであっても、
  4. // 上記のスクリプトだと「改行」と見なされてしまい、「月」は出力されない
  5. ?>

等としてしまうと「改行」とみなされてしまいます。回避策はシングルクォートで括る「'\n'」か、ダブルクォーテーションで\を2重にエスケープします。「"\\n"

参考 文字列のエスケープ

上記を踏まえて、エスケープ処理を施したのが以下のサンプルです。

  1. <?php
  2. print date("\\to\d\a\y \i\s l")."<br />\n"; // ダブルクォートの場合
  3. print date('\to\d\a\y \i\s l'); // シングルクォートの場合
  4. ?>

出力結果

t2017day is Tuesday
t2017day is Tuesday

タイムスタンプとフォーマット、挙句にエスケープ処理まで入って混乱しているかもしれませんが、がんばって覚えて下さい。こういった処理に関しては慣れも大きいのでたくさんのスクリプトに触れているうちになんとなく慣れてきます。