PHPとMySQLの日付型のFORMAT

20141204

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

MySQLの記事を続けてきましたが、ちょっと趣向を変えてPHPとMySQLについて書きたいと思います。

PHPとMySQLを使って開発をしているのですが、いろんな形式で日付を出したいことが多くありました。
どちらにも形式を指定して出力する関数がありますが、指定するFORMATがなかなか覚えられないのです。
片方だけでも使えれば、とりあえず何とかなりますが、やはり適材適所で使っていきたいですよね。

そんなときにGoogle先生に聞いたり、マニュアルを見たりするのですが、どっちも載ってる酔狂なところはなかなかありません。
ということで、そんな酔狂な表を作ってみました。

日付の関数

おさらいということで、まずはPHPとMySQLの日付を書式化する関数から。

○PHP

PHPには、2つやり方があります。

<?php
	$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″と出力されます。

<?php
	$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始まり3N-1(月曜)から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:00c-ISO 8601
日付と時刻(英語)Wed, 01 Apr 2015 09:03:06 +0900r-RFC 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
その他
サマータイム0I-1ならサマータイム中
うるう年0L-1ならうるう年

※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でしたが、他の言語で同じフォーマットを出力するには?と考えるのも、面白いですね。

株式会社ライズウィル

株式会社ライズウィル

〒110-0016
東京都台東区台東1-27-11 やわらぎビル2F
TEL : 03-4590-3200
FAX : 03-4590-3201
E-Mail : info@risewill.co.jp
URL : https://www.risewill.co.jp

海上コンテナ輸送管理システム「海コン魂!」
海コン魂!
面接予約・スタッフ管理システム「WebWORKS.」
WebWORKS.