PHPとMySQLの日付型のFORMAT

こんにちは、システムエンジニアのリョータです。

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桁2015Y%Y
西暦2桁15y%y
ゼロ付き04m%m
ゼロ無し4n%c
英名AprilF%M
英名(略名)AprM%b3文字
ゼロ付き01%d
ゼロ無し1%e
接尾辞付き(英語)1stjS%D1st, 2nd, 3rd, 4th…
曜日
英名Wednesdayl%W
英名(略名)WedD%a3文字
数値:日曜0始まり3w%w0(日曜)から6(土曜)
数値:月曜1始まり3N1(月曜)から7(日曜)
ISO 8601
24時形式:ゼロ付き09H%H
24時形式:ゼロ無し9G%k
12時形式:ゼロ付き09h%h
%I
12時形式:ゼロ無し9g%l
AM/PMAMA%p
am/pmama
ゼロ付き03i%i
ゼロ付き06s%S
%s
マイクロ秒
6桁654321u%f
書式
日付と時刻2015-04-01T09:03:06+09:00cISO 8601
日付と時刻(英語)Wed, 01 Apr 2015 09:03:06 +0900rRFC 2822
時刻:24時形式09:03:06H:i:s%T
時刻:12時形式(AM/PM)09:03:06 AMh:i:s A%r
タイムゾーン
UTC時差:コロンあり+0900O
UTC時差:コロン無し+09:00P
UTC時差:秒数32400Z-43200から50400
英名Asia/Tokyoe
英名(略名)JSTT
通算
日数:ゼロ始まり90z
日数:1始まりゼロ付き091%j
週数:ゼロあり
日曜開始曜日基準
13%U※1
週数:ゼロあり
月曜開始4日基準
14%u※1
週数:ゼロ無し
日曜開始曜日基準
13%V※1
※2
週数:ゼロ無し
月曜開始4日基準
14W%v※1
※2
ISO 8601
週数の年:ゼロ無し
日曜開始曜日基準
2015%X
週数の年:ゼロ無し
月曜開始4日基準
2015o%xISO 8601
UNIX時刻(経過秒数)1427846586U※3
その他
サマータイム0I1ならサマータイム中
うるう年0L1ならうるう年
※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でしたが、他の言語で同じフォーマットを出力するには?と考えるのも、面白いですね。
DXO株式会社

DXO株式会社

〒103-0014
東京都中央区日本橋蛎殻町2-13-6
EDGE水天宮8F
E-Mail : contact-info@dxo.co.jp
URL : https://dxo.co.jp