MySQLの記事を続けてきましたが、ちょっと趣向を変えてPHPとMySQLについて書きたいと思います。
PHPとMySQLを使って開発をしているのですが、いろんな形式で日付を出したいことが多くありました。
どちらにも形式を指定して出力する関数がありますが、指定するFORMATがなかなか覚えられないのです。
片方だけでも使えれば、とりあえず何とかなりますが、やはり適材適所で使っていきたいですよね。
そんなときにGoogle先生に聞いたり、マニュアルを見たりするのですが、どっちも載ってる酔狂なところはなかなかありません。
ということで、そんな酔狂な表を作ってみました。
日付の関数
おさらいということで、まずはPHPとMySQLの日付を書式化する関数から。○PHP
PHPには、2つやり方があります。
$now = time();
$yesterday = $now - (60 * 60 * 24); // 60秒 * 60分 * 24時間 = 1日
echo date('Y-m-d', $yesterday);
?>
1つ目は、Unixのタイムスタンプ(int型)を書式化するdate関数です。32bitだと2038年問題をはらんでいたり、直感的に時間を変えられなかったり、マイクロ秒には対応していなかったり(※)しますが、日付や時刻をちょちょいと表示するには非常に便利です。
※date関数でマイクロ秒の出力をしようとすると、”000000″と出力されます。
$date = new DateTime();
$date->modify('-1 day');
echo $date->format('Y-m-d');
?>
2つ目は、PHP5.2以上なら使用できる、DateTimeクラスのformatメソッドを使う方法です。addやsubメソッド、直感的に日付を変えられるmodifyメソッドがあります。
コピーはcloneで。
※DateTimeクラスはマイクロ秒に対応していますが、現在日時を生成しても取得できません。マイクロ秒はmicrotime関数で取得して設定する必要があります。
○MySQL
MySQLには、日付(時間)を保持するデータタイプにDATE型、DATETIME型、TIMESTAMP型、TIME型があります。(※)それぞれ使う場所によってデータタイプは変わってくると思いますが、書式の関数は全部共通です。
SELECT
DATE_FORMAT((date_column - INTERVAL 1 DAY), '%Y-%m-%d')
FROM
test_table
;
DATE_FORMAT関数を利用して、書式を整えたり、年や月でGROUP BYしたりできます。なお、DATETIME型とTIMEPSTAMP型は、MySQL5.6.4以降であればマイクロ秒が利用できます。
※ちなみにYEAR型というものもありますが、DATE_FORMAT関数は使えないようです。
日付の書式
さて、本題の書式の表です。書式はPHP,MySQLそれぞれのFORMATを指定する引数に指定してください。
形式 | 出力例 | PHP 書式 | MySQL 書式 | 備考 |
---|---|---|---|---|
年 | ||||
西暦4桁 | 2015 | Y | %Y | |
西暦2桁 | 15 | y | %y | |
月 | ||||
ゼロ付き | 04 | m | %m | |
ゼロ無し | 4 | n | %c | |
英名 | April | F | %M | |
英名(略名) | Apr | M | %b | 3文字 |
日 | ||||
ゼロ付き | 01 | d | %d | |
ゼロ無し | 1 | j | %e | |
接尾辞付き(英語) | 1st | jS | %D | 1st, 2nd, 3rd, 4th… |
曜日 | ||||
英名 | Wednesday | l | %W | |
英名(略名) | Wed | D | %a | 3文字 |
数値:日曜0始まり | 3 | w | %w | 0(日曜)から6(土曜) |
数値:月曜1始まり | 3 | N | – | 1(月曜)から7(日曜) ISO 8601 |
時 | ||||
24時形式:ゼロ付き | 09 | H | %H | |
24時形式:ゼロ無し | 9 | G | %k | |
12時形式:ゼロ付き | 09 | h | %h %I | |
12時形式:ゼロ無し | 9 | g | %l | |
AM/PM | AM | A | %p | |
am/pm | am | a | – | |
分 | ||||
ゼロ付き | 03 | i | %i | |
秒 | ||||
ゼロ付き | 06 | s | %S %s | |
マイクロ秒 | ||||
6桁 | 654321 | u | %f | |
書式 | ||||
日付と時刻 | 2015-04-01T09:03:06+09:00 | c | – | ISO 8601 |
日付と時刻(英語) | Wed, 01 Apr 2015 09:03:06 +0900 | r | – | RFC 2822 |
時刻:24時形式 | 09:03:06 | H:i:s | %T | |
時刻:12時形式(AM/PM) | 09:03:06 AM | h:i:s A | %r | |
タイムゾーン | ||||
UTC時差:コロンあり | +0900 | O | – | |
UTC時差:コロン無し | +09:00 | P | – | |
UTC時差:秒数 | 32400 | Z | – | -43200から50400 |
英名 | Asia/Tokyo | e | – | |
英名(略名) | JST | T | – | |
通算 | ||||
日数:ゼロ始まり | 90 | z | – | |
日数:1始まりゼロ付き | 091 | – | %j | |
週数:ゼロあり 日曜開始曜日基準 | 13 | – | %U | ※1 |
週数:ゼロあり 月曜開始4日基準 | 14 | – | %u | ※1 |
週数:ゼロ無し 日曜開始曜日基準 | 13 | – | %V | ※1 ※2 |
週数:ゼロ無し 月曜開始4日基準 | 14 | W | %v | ※1 ※2 ISO 8601 |
週数の年:ゼロ無し 日曜開始曜日基準 | 2015 | – | %X | |
週数の年:ゼロ無し 月曜開始4日基準 | 2015 | o | %x | ISO 8601 |
UNIX時刻(経過秒数) | 1427846586 | U | – | ※3 |
その他 | ||||
サマータイム | 0 | I | – | 1ならサマータイム中 |
うるう年 | 0 | L | – | 1ならうるう年 |
その年の第1週について基準によって異なります。
曜日基準の場合は、始まりの曜日が最初にきた週が第1週となります。
4日基準の場合は、1月4日を含む週が第1週となります。
4日基準月曜始まりの場合、ISO 8601で定義されている「その年の最初の木曜日を含む週が第1週」という定義と同義です。
MySQLでは、WEEK関数でも通算週数が取得できます。
※2
第0週を使用せず前後の年のいずれかに含めます。
例えば、2015年は、日曜始まり曜日基準の場合は1月4日が日曜日なので、1月1日から1月3日は2014年の第52週に含まれます。月曜始まり4日基準の場合は、2014年12月28日月曜日から2015年1月4日までが第1週となります。
前後いずれの年に属するか表示するフォーマットは定義されています。
※3
1970年1月1日0時0分0秒からの経過秒数です。MySQLではUNIX_TIMESTAMP関数で取得できます。
最後に
PHPとMySQL、アプリケーションとデータベースのどちらかが使えれば、なんとかなる局面はたくさんあると思います。どちらがいいというのは、そのシステムや行う処理・機能によって異なってきますからむずかしいですが、何ができて何ができないか、何が得意で何が不得意か、把握しておくのは重要かなと思います。
今回はPHPとMySQLでしたが、他の言語で同じフォーマットを出力するには?と考えるのも、面白いですね。